2012-10-01 4 views
5

OSGiコンテナ(現在はEquinox)で動作するアプリケーションを設計しています。 RabbitMQを介してメッセージを受信し、内部的に処理します。アプリケーションは継続的にサーバーとして実行されます。私の現在の計画は、QueueingConsumerを使用し、独自のスレッドで実行しているRabbitMQリスナバンドルにキューを設定してリスナを配置させることです。リスナーは、メッセージを処理するための1つ以上の処理サービスを呼び出します。プロセッサは、データベースにアクセスするためにJDBC呼び出しを行う必要があります。私はプロセッサが呼び出される順序を制御できるようにしたいと考えています。 RabbitMQリスナーをコード化しなくても、後でもっと多くのサービスを追加できる柔軟性があるのは良いことです。PreparedStatementを使用しているときにRabbitMQを使用してJava OSGiアプリケーションを設計する

私が直面している問題は、メッセージがバーストまたはゆっくりと出る可能性があることです。 PreparedStatementを使用してデータベースへのアクセスを高速化したいと考えていますが、何も起こっていない間にも接続を長期間開いておくことは望ましくありません。私はDefaultConsumerを直接サブクラス化し、それをRabbitMQ Connectionのスレッドで実行させることを考えましたが、何も起こっていないときを知る能力を失います。私の元の考えは、メッセージプロセッサーをOSGiサービスとして完全に分離しておき、呼び出されるたびにプールからデータベース接続を取得することでしたが、プリペアドステートメントの利点が失われていました。私はTomcat JDBCプールを使用していますが、文キャッシュを準備していないようです。また、すべての呼び出しに対して準備されたステートメントを作成するのにどれくらいの費用がかかりますか分かりませんが、無駄に見えます。

私が今までに思いついた最善のアイデアは、リスナーをダブルループで処理させることです。外部ループはメッセージを待ってから、データベース接続とプリペアドステートメントを確立し、指定されたタイムアウトの間メッセージが来ないようになるまで内部ループを呼び出し、接続を閉じて外部ループに戻ります。私はこれを処理の単一のビットのために働くが、私は異なる準備されたステートメントを持つかもしれない複数のプロセッサを持っている場合、これを管理する方法を視覚化するのに困っている。

多分、私は複数のサービスのアイデアをあきらめ、処理を自分のリスナーにハードコードする必要があります。

提案がありますか?ありがとう!

答えて

1

サービスをリスナーとして使用し、使用するJDBC接続を渡すのはなぜですか?その後、単一のコードでキューがサービスにディスパッチされます。この中央ディスパッチャは、準備されたJDBC接続のプールを自明に維持することができます。 APIでJDBC接続を表示したくない場合は、Coordinatorサービスを使用して接続を保持します。 「認識」サービスは、最適化されたJDBC接続を取得できます。

また、リスナーサービスのサービスとしてDataSourceを登録し、独自のプールポリシーを実装します。 OSGiサービスコールで呼び出し元を知っているので、すべての種類の最適化を行うことができます。準備されたステートメントをバンドルのjarから読み込み、それに応じてキャッシュします。

ここでサービスをあきらめることはありません。デカップリングは素晴らしいです。私は経験から知っています。このモデルでは、サービスリスナーはRabbitMQに依存しないため、簡単にそれらをテストしたり、別のキューテクノロジに切り替えることができます。

さらに、の場合、最も良い方法は、最も簡単な解決方法です。パフォーマンスの問題がある場合は、ボトルネックを測定して修正してください。早期の解決策では、無駄な労力が浪費されています...私はあなたの時間を無駄にしてしまった、ちょっとした早すぎる最適化を教えてくれます。

+0

ありがとうございました。私はOSGiの初心者で、ハード・ノックの学校で学んでいます。私はコーディネーターサービスに精通していませんが、私はそれをチェックアウトします。私はこれを投稿して以来、サービスの代わりにサービス作成者を登録する考えがありました。呼び出し元は、実際のサービスを作成するためにそれらを使用して、準備された文を「ちょうどいい時間に」作成し、活動のバースト中にそれらを使用し、時報が発生したときに閉じることができます。 –

+0

実行中のEquinoxのバージョンを確認しましたが、コーディネーターサービスが表示されません。それを稼働させるために何か特別なことがありますか?私は、リリース4バージョン4.3を使用していると思います。 –

+0

私は* Coordinator Service *が* "あなたのサービスにキューをディスパッチするコード" *を指していると思います。 *コーディネーター*と呼ばれる標準的なOSGiサービスについて聞いたことはありません。 –

関連する問題