OSGi コンテナー (現在 Equinox) で実行されるアプリケーションを設計しています。RabbitMQ 経由でメッセージを受信し、内部で処理します。アプリケーションはサーバーとして継続的に実行されます。私の現在の計画は、RabbitMQ リスナー バンドルでキューを構成し、リスナーをそれらに配置してQueueingConsumer
、独自のスレッドを使用して実行することです。リスナーは、メッセージを処理するために 1 つ以上の処理サービスを呼び出します。プロセッサーは、データベースにアクセスするために JDBC 呼び出しを行う必要があります。プロセッサが呼び出される順序を制御できるようにしたいと考えています。RabbitMQ リスナーを再コーディングせずに、後でサービスを追加できる柔軟性があると便利です。
私が直面している問題は、メッセージがバーストまたはゆっくりと届く可能性があることです。を使用してデータベースへのアクセスを高速化できるようにしPreparedStatement
たいのですが、何も行われていない間、接続を長期間開いたままにしたくありません。DefaultConsumer
直接サブクラス化して、 RabbitMQ のスレッドで実行することを考えましConnection
たが、何も起こっていないことを知る能力が失われます。私の最初のアイデアは、メッセージ プロセッサを OSGi サービスとして完全に分離し、それぞれが呼び出されるたびにプールからデータベース接続を取得することでしたが、それではプリペアド ステートメントの利点が失われました。Tomcat JDBC プールを使用していますが、Prepared Statement キャッシュがないようです。また、すべての呼び出しに対して準備済みステートメントを作成するのにどれだけの費用がかかるかはわかりませんが、無駄に思えます。
これまでに思いついた最良のアイデアは、リスナーを二重ループで処理させることです。外側のループはメッセージを待ってから、データベース接続と準備済みステートメントを確立する内側のループを呼び出し、指定されたタイムアウトまでメッセージが来なくなるまで実行し、接続を閉じて外側のループに戻ります。私はこれを 1 ビットの処理で動作させましたが、複数のプロセッサが異なる準備済みステートメントを持つ可能性がある場合、これを管理する方法を視覚化するのに苦労しています。
おそらく、複数のサービスのアイデアをあきらめて、処理をリスナーにハードコーディングする必要があります。
助言がありますか?ありがとう!