簡體   English   中英

EJB3相關ID

[英]EJB3 correlation ID

現在,我的同事們正在研究日志記錄子系統,他們希望綁定從一些業務方法啟動的單獨操作。 例如,如果來自bean A的方法調用bean B中的某個方法,然后在bean C中調用bean,那么知道比bean B中的業務方法更好,並且bean C為Bean A中的方法做了一些工作。特別是它會很棒知道B和C的方法完成了一些工作單元的具體調用bean A.

那么,問題是如何將這些工作單元整合到一起呢? 顯然,使用方法參數進行綁定並不美觀!

而且我認為現在是時候提出另一個問題了,這個問題與前一個問題相近。 如果我想將一些上下文信息從bean A傳播到另一個從A調用的bean,該怎么辦? 安全憑證和安全主體之類的東西? 我能做什么? 可能是我問的問題是某種不良做法?

看起來像一個很好的用例,在LogbackLog4J中都可用。 實質上,您將一些自定義值附加到一個線程,並且從該線程傳入的所有日志記錄消息都可以將該值附加到該消息。

我認為在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.xmllog4j.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM