OSGiコンテナ(現在はEquinox)で動作するアプリケーションを設計しています。 RabbitMQを介してメッセージを受信し、内部的に処理します。アプリケーションは継続的にサーバーとして実行されます。私の現在の計画は、QueueingConsumer
を使用し、独自のスレッドで実行しているRabbitMQリスナバンドルにキューを設定してリスナを配置させることです。リスナーは、メッセージを処理するための1つ以上の処理サービスを呼び出します。プロセッサは、データベースにアクセスするためにJDBC呼び出しを行う必要があります。私はプロセッサが呼び出される順序を制御できるようにしたいと考えています。 RabbitMQリスナーをコード化しなくても、後でもっと多くのサービスを追加できる柔軟性があるのは良いことです。PreparedStatementを使用しているときにRabbitMQを使用してJava OSGiアプリケーションを設計する
私が直面している問題は、メッセージがバーストまたはゆっくりと出る可能性があることです。 PreparedStatement
を使用してデータベースへのアクセスを高速化したいと考えていますが、何も起こっていない間にも接続を長期間開いておくことは望ましくありません。私はDefaultConsumer
を直接サブクラス化し、それをRabbitMQ Connection
のスレッドで実行させることを考えましたが、何も起こっていないときを知る能力を失います。私の元の考えは、メッセージプロセッサーをOSGiサービスとして完全に分離しておき、呼び出されるたびにプールからデータベース接続を取得することでしたが、プリペアドステートメントの利点が失われていました。私はTomcat JDBCプールを使用していますが、文キャッシュを準備していないようです。また、すべての呼び出しに対して準備されたステートメントを作成するのにどれくらいの費用がかかりますか分かりませんが、無駄に見えます。
私が今までに思いついた最善のアイデアは、リスナーをダブルループで処理させることです。外部ループはメッセージを待ってから、データベース接続とプリペアドステートメントを確立し、指定されたタイムアウトの間メッセージが来ないようになるまで内部ループを呼び出し、接続を閉じて外部ループに戻ります。私はこれを処理の単一のビットのために働くが、私は異なる準備されたステートメントを持つかもしれない複数のプロセッサを持っている場合、これを管理する方法を視覚化するのに困っている。
多分、私は複数のサービスのアイデアをあきらめ、処理を自分のリスナーにハードコードする必要があります。
提案がありますか?ありがとう!
ありがとうございました。私はOSGiの初心者で、ハード・ノックの学校で学んでいます。私はコーディネーターサービスに精通していませんが、私はそれをチェックアウトします。私はこれを投稿して以来、サービスの代わりにサービス作成者を登録する考えがありました。呼び出し元は、実際のサービスを作成するためにそれらを使用して、準備された文を「ちょうどいい時間に」作成し、活動のバースト中にそれらを使用し、時報が発生したときに閉じることができます。 –
実行中のEquinoxのバージョンを確認しましたが、コーディネーターサービスが表示されません。それを稼働させるために何か特別なことがありますか?私は、リリース4バージョン4.3を使用していると思います。 –
私は* Coordinator Service *が* "あなたのサービスにキューをディスパッチするコード" *を指していると思います。 *コーディネーター*と呼ばれる標準的なOSGiサービスについて聞いたことはありません。 –