私は、ステートレスJavaアプリケーションをTomcat Webサーバーにデプロイしました。データの性質上、ある時点では、すべてのhttpスレッドが異なるキーを処理しなければなりません(つまり、すべてのスレッドが異なるキーを処理している必要があります)。JavaのTomcat特定のHTTPスレッドのみをキューに入れる方法は?
したがって、要求のキーが進行中であれば(これ以前のhttp投稿によって)、http投稿をキューに入れるモジュールを作成しました。私は、同じキーを持つ前のhttp投稿がプロセスを完了すると、現在のhttp投稿を処理し続けるだけです。
私は、進行中の同じキーで以前のリクエストがあるかどうかをテストするために、concurrenthashmapを使って単純なwhileループを書きました。パフォーマンスはサブパイルであり、予期しない動作があります。これは、コードスニペットです:それぞれのHTTP POSTの終わりに
//This part of code is place inside the servlet
private static ConcurrentHashMap<String, String> transQueue = new ConcurrentHashMap<String, String>();
private void inQueuePoll(String queueKey) {
while(transQueue.containsKey(queueKey)){
synchronized(this){
try{
Thread.sleep(50); // i know this is bad, any idea to improve this?
logger.trace("Wait for Que Key: "+queueKey + ");
}catch (InterruptedException e) {
e.printStackTrace();
}
}
}
transQueue.put(queueKey, "");
}
、finallyブロックで、私は入れ:transQueue.remove(queueKey)私はConcurrentHashMapのからそれを削除持っていることを確認します。しかし、私の最悪の悪夢では、サーバーログから、私はqueueKey、別のhttpのポストスレッドを削除する前に、上記のwhileループを抜け出し、処理を続行することに気付きました。
上記のコードでhttpスレッドを「キューに入れる」に間違ったことはありますか?
また、私がこれをもっとうまくやっていく方法についてのアイデアは非常に高く評価されています。