[英]EJB3 correlation ID
現在,我的同事們正在研究日志記錄子系統,他們希望綁定從一些業務方法啟動的單獨操作。 例如,如果來自bean A的方法調用bean B中的某個方法,然后在bean C中調用bean,那么知道比bean B中的業務方法更好,並且bean C為Bean A中的方法做了一些工作。特別是它會很棒知道B和C的方法完成了一些工作單元的具體調用bean A.
那么,問題是如何將這些工作單元整合到一起呢? 顯然,使用方法參數進行綁定並不美觀!
而且我認為現在是時候提出另一個問題了,這個問題與前一個問題相近。 如果我想將一些上下文信息從bean A傳播到另一個從A調用的bean,該怎么辦? 安全憑證和安全主體之類的東西? 我能做什么? 可能是我問的問題是某種不良做法?
看起來像mdc的一個很好的用例,在Logback和Log4J中都可用。 實質上,您將一些自定義值附加到一個線程,並且從該線程傳入的所有日志記錄消息都可以將該值附加到該消息。
我認為在EJB中實現它的最佳方法是攔截器 :
public class MdcInterceptor {
@AroundInvoke
public Object addMdcValue(InvocationContext context) throws Exception {
MDC.put("cid", RandomStringUtils.randomAlphanumeric(16));
try {
return context.proceed();
} finaly {
MDC.remove("cid");
}
}
}
現在你需要做的就是添加:
%X{user}
到你的日志模式( logback.xml
或log4j.xml
)。
對於通用上下文信息,您可以使用TransactionSynchronizationRegistry 。 它可能看起來像這樣:
@Stateless
public class MyBean {
@Resource
TransactionSynchronizationRegistry registry;
@AroundInvoke
public Object setEntryName(InvocationContext ic) throws Exception {
registry.putResource(NAME, "MyBean");
return ic.proceed();
}
}
@Stateless
public class MyBean2 {
@Resource
TransactionSynchronizationRegistry registry;
public void doJob() {
String entryName = (String)registry.getResource(NAME);
...
}
}
我相信它通常使用ThreadLocal變量實現,因為通常每個事務都映射到應用程序服務器中的sigle線程。 因此,如果您的AS中沒有實現TransactionSynchronizationRegistry(例如在JBoss 4.2.3中)或者您需要更低級別的工具,則可以直接使用ThreadLocal變量。
順便說一句,我想MDC實用程序使用相同的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.