現在のスレッドがどのWebサイトコンテキストにあるかを設定および取得するために呼び出すことができる「マネージャー」をWebアプリに実装しています(Webサイトコンテキストが現在のサイトを表すように、サイトにホワイトラベルを付けます)
私はこれを行うための最良の戦略を見つけようとしています。現在、同時ハッシュマップでWebSiteContextsへのスレッドのストアを実装しています。
private final ConcurrentHashMap<Thread, WebSiteContext> chm = new ConcurrentHashMap<Thread, WebSiteContext>();
スレッドの開始時に(サーブレットフィルタを介して、または手動で設定することにより)、スレッドはそのWebSiteContextに関連付けられます。
ただし、メモリリークを回避するために、マップをクリーンアップする必要があります。したがって、1つの戦略は、マップのスレッドキーを繰り返し処理して、スレッドが「生きている」かどうかを確認し(thread.isAlive())、そうでない場合は、たとえば次のように削除することだと思います。
public class Cleaner implements Runnable {
private static final int INTERVAL = 6 * 1000; // 6 seconds
public Cleaner() {
}
public void run() {
// soo every interval iterate through the threads if they're dead then remove it from the map.
while(true) {
try {
Set<Thread> threads = chm.keySet();
Set<Thread> staleThreads = new HashSet<Thread>();
for (Thread tmpThread : threads) {
// if we get to a dead thread then clean the fucker up
if (!tmpThread.isAlive()) {
// think that we're going to get a run condition anyway
chm.remove(tmpThread);
}
}
Thread.sleep(INTERVAL);
} catch (Exception e) {
log.error("caught exception e:", e);
}
}
}
}
、しかし、これは私が避けたいものであるマップへのアクセスを同期する必要があると思います(またはそうしますか?)。
Javaのスレッドに属性を格納したり、実際にスレッドオブジェクトをキーとして持つマップをクリーンアップしたりするための「慣用的な」パターンはありますか?私はWeakReference/SoftReferencesを使用することにオープンです。実際、Thread.getCurrentThread()。setAttribute(Object、Object)に相当するものがある場合は、それは素晴らしいことです。
乾杯サイモンB