-
27-10-2019 - |
質問
私の同僚は、サブシステムのロギングに取り組んでおり、彼らはいくつかのビジネス方法から開始された別々の操作をバインドしたいと考えています。たとえば、Bean aからの方法がBean Bで何らかの方法を呼び出し、Bean Cで何らかの方法を呼び出し、Bean BやBean Cのビジネス方法よりも知っておくのは素晴らしいことです。 BとCからの方法が、コンクリートコールオブビーンAのために作業単位を行ったことを知ってください。
それで、問題は、この作業ユニットを合計に結び付ける方法です。明らかに、バインディングのためにメソッド引数を使用することは美しくありません!
また、以前の質問に十分近い別の質問をする時が来たと思います。 Bean Aから別の豆にコンテキスト情報を伝播したい場合はどうなりますか?セキュリティ資格情報やセキュリティプリンシパルのようなもの?私に何ができる?私が尋ねた質問かもしれませんが、ある種の悪い練習は?
解決
のための適切なケースのように見えます MDC, 、両方で利用可能です ログバック と 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スレッドにマップします。したがって、TransactionSynChronizationRegistryがASに実装されていない場合(JBoss 4.2.3の例など)、または低レベルのツールが必要な場合は、threadlocal変数を直接使用できます。
ところで、MDCユーティリティはカバーの下で同じものを使用していると思います。