JavaEE Webアプリケーション内では、着信メッセージを厳密に到着順に処理する必要があります。 Webappコンテナ(Tomcat 6)は、httpポートに到着するメッセージの順序を保持していると仮定します。厳密な順序でのメッセージの並行処理
私に頭痛を引き起こす原因は、これらのメッセージを内部的に処理する方法です。作業負荷を改善するために、ここでは多くのことを行う必要があるため、各メッセージの処理をThreadPoolに追加します。 XML解析、時には外部Webサービスを使用したデータの充実処理が終了したら、メッセージのJava表現を複合ストリーム処理エンジンesper.codehaus.orgにプッシュします。これはスレッドセーフです。ここでは、入射順序が最も高い要件、例えば現象の閾値を超える場合に、異なるパターンがチェックされる。
到着時に受け取った優先度ID(各サーブレットでは、メッセージごとにインクリメントされる)で処理されたすべてのメッセージをPriorityQueueに挿入するという考えがありました。
キューから要素をポーリングしているスレッド(最下位のIDがキューの先頭です)は、エスペアに挿入するために、欠落している項目をチェックしないためIDをスキップできます。私はイラストが良くうまくいくと思います:(4)すべてが意図したとおりに動作する手順(1)については
。しかし、ステップ(5)において、QueuePollerは、エレメント6を検索し、エレメント4は検索しない(ステップ(6)で後に挿入される)。メッセージの順序は次のようになります。 3; 6; 4.
私が試みたのは、厳密なIDの順序に従ってキューの頭をポーリングする実装を変更することでした。つまり、次のIDの要素がまだキューに挿入されていない場合は、その時点までバリアを待ちます。これは最初の10分間は機能していたようですが、おそらくキューに挿入されなかった要素が原因でハングしました。
これまで誰かが同じような問題を抱えていて、私にはいくつかのヒントがありますか?
キューアイテムがサーバーに到着するとすぐに作成し、キューから順番に処理されるようにしたり、キューの処理が完了したらすぐに作成したりする方がよい場合があります。 –
私が理解できないことは、出力キューの要素の順序が入力キューの順序と一致しなければならない場合、それらを順不同で処理していることです。つまり、QueuePollerが6より前に4を持つ必要がある場合は、なぜ4よりも前に6を行うのですか? – aib
私はその2つについて考えましたが、同様の結果につながると思います。処理が完了したことを示すフラグを使用すると、何らかの処理がうまくいかない場合(サーバのタイムアウトなど、要素が挿入されていないという問題もあります)、同じ問題が発生する可能性があります。したがって、インジケータフラグは決してtrueに設定されません。 – matthes