4

現在、私の同僚はロギングサブシステムに取り組んでおり、あるビジネスメソッドから開始された個別の操作をバインドしたいと考えています。たとえば、BeanAのメソッドがBeanBのメソッドを呼び出し、次にBean Cのメソッドを呼び出す場合、BeanBのビジネスメソッドよりも知っておくと便利です。BeanCはBeanAのメソッドのスタッフを何人か実行します。 BとCのメソッドが、BeanAの具体的な呼び出しのためにいくつかの作業単位を実行したことを知っています。

それで、問題は、この作業単位をどのように合計に結び付けるかということです。明らかに、バインディングにメソッド引数を使用するのは美しくありません!

また、前の質問に十分近い別の質問をする時が来たと思います。Bean AからAから呼び出される別のBeanにコンテキスト情報を伝播したい場合はどうなりますか?セキュリティクレデンシャルやセキュリティプリンシパルのようなものですか?私に何ができる?私が尋ねた質問は、ある種の悪い習慣ですか?

4

2 に答える 2

3

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.xmlまたはlog4j.xml)に。

も参照してください

于 2012-02-19T21:49:40.603 に答える
0

汎用コンテキスト情報については、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変数を使用して実装されると思います。したがって、TransactionSynchronizationRegistryがASに実装されていない場合(JBoss 4.2.3など)、または低レベルのツールが必要な場合は、ThreadLocal変数を直接使用できます。

ところで、MDCユーティリティは裏で同じものを使用していると思います。

于 2012-02-21T14:04:23.810 に答える