2

JMS と Spring Integration を使用して接続された複数のアプリケーションを含むシステムがあります。メッセージは一連のアプリケーションに沿って送信されます。

[アプリA] -> [アプリB] -> [アプリC]

メッセージ ヘッダーにグローバル ID を設定して、システム全体で各メッセージのライフサイクルを追跡できるようにします。

システム内のログ メッセージの先頭にメッセージ グローバル ID を追加できるようにしたいと考えています。

他の誰かがこれをしましたか?この変数をスレッドに関連付けて、将来のメソッドでアクセスできるようにする方法はありますか? システムのメソッドで変数を渡したくありません。

4

4 に答える 4

2

ThreadLocal はあなたがここで望むものかもしれないと思いますが、このアプローチは ThreadLocal の目的の乱用または良い設計であると考える人もいるかもしれません。何かのようなもの:

public class MyIDManager {
  public static final ThreadLocal<Long> myID = new ThreadLocal<Long>();
}

...
// set ID at some point
MyIDManager.myID.set(theNewID);

...
// read it later
long currentID = MyIDManager.get();

ここでの魔法は、myID の値が実際には Thread に固有であり、異なるスレッドからアクセスされると異なることです。

その後、ID をログに記録するなど、ID を使用して好きなことを行うことができます。

于 2009-11-09T14:59:58.877 に答える
1
Thread t = Thread.currentThread();
t.setName("Your ID Here");
于 2009-11-09T14:51:09.220 に答える
0

Another answer, which I believe the first post is alluding to, is to simply ask your logging framework to include the thread name in the log statement. For example, log4j lets you add the thread name with 't' in its PatternLayout: http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html I've seen this in other frameworks too.

于 2009-11-09T15:02:32.130 に答える