2016-08-16 15 views
0

JBoss FUSEに組み込まれているAMQを活用し、コンテナで起動する機能を追加したいと思っています。つまり、起動レベルに開始機能が追加されます< = 100.FUSEでAMQブローカーの開始を待ち受ける方法

この機能はAMQ経由でいくつかのメッセージをすぐに送信しようとしますので、私はロジックを追加してブローカの開始イベントを待ちます。その上、私が持っている

だけハンドルが、現在のようなログに記録されたメッセージである:私のフィーチャーファイル内

... | ActiveMQServiceFactory   | 196 - io.fabric8.mq.mq-fabric 
     - 1.2.0.redhat-143 | Broker amq has started. 

、私のような、機能の依存関係のカップルを作成しようとした:

<feature name="myFeature" ... 
    <feature version="1.2.0.redhat-133">mq-fabric</feature> 
    <feature version="5.11.0.redhat-620133">activemq</feature> 

..しかし、それはうまくいきませんでした。私はまた、90年代の何かに開始レベルを設定しようとしましたが、それはどちらもうまくいきませんでした。

私はこれらのアプローチで何かを見逃しましたか?

私の青写真に挿入できる関連OSGiサービスはありますか?つまり、いくつかの.isBrokerStarted()メソッドを持つものでしょうか?

私の最近の考えは、おそらく私が助言メッセージのコールバックを登録することができるということです。それが動作すれば答えとして投稿します。

残念ながら、私はもはや、アドバイザリトピックに接続して聞く試みが実行可能なアプローチであるとは考えていません。私はこの機能を導入しました。上記の 'broker start'ログメッセージの後にインストールすると正常に動作しますが、それ以外の場合は失敗します。

問題は、AMQが非同期的に起動している間に青写真のコンテキストの初期化が行われるため、結果の接続が無効であるように見えます。私は、AMQ接続ファクトリ、またはCamelコンポーネントが不透明にこの条件に対して何らかの保証を提供すると考えていたでしょう。どうやらそれはそうではありません。彼らのAPI(具体的には、org.apache.activemq.ActiveMQSslConnectionFactoryとorg.apache.camel.component.jms.JmsConfiguration)を調べると、ステータスチェックのためのパブリックメソッドが見つからないのですが... "testConnectionOnStartup" Camelコンポーネントのプロパティおそらくこれは文書化されているように行われ、1つ以上の例外がスローされたでしょうが、そうではありません。とても混乱するような。 24-AUG-2016

UPDATE:

は最終的にこれで動作するように少しだけ多くの時間を持っていたし、カップルの事を試してみました... 私はので、ラクダ-AMQ上の特徴の依存関係に置きますそれは、機能の依存チェーンの「上部」である:

ラクダ-AMQ - >は、MQ-ファブリックに依存 - >は、ActiveMQのに依存します - >これは動作しませんでしたActiveMQのクライアント

に依存します。しかし、もう少しロギングを調整した後、私は上記で私が何を示唆しているかを確認したと思います。開始レベルと機能の依存関係は、この問題をそのまま解決することはできません。すべての従属機能またはより低い開始レベルのバンドルは、amqブローカーが実際に準備ができている(そして上記のメッセージをロギングする)前にインストール/開始されたことを報告します。

このように、私の特徴はインストール、開始、そして失敗です。投稿のタイトルから「AMQブローカーの開始を聞いてください」ということをする方法が見つからない限り。誰かがこれを行う方法を知っていますか?25-AUG-2016

UPDATE:

Iは(ブローカ開始メッセージを記録)ActiveMQServiceFactory自体は、そのコンテキストにローカルorg.apache.activemq.broker.BrokerServiceのインスタンスのハンドルを有していることがわかります。これもOSGiサービスとして提供されている場合、私は "broker.waitUntilStarted();"を待ち、プログラムでJMS接続を作成できると思います。これを試す時間があるときに戻ってきます...

答えて

0

最初に、ActiveMQServiceFactoryで使用可能なハンドルを得る方法はありません... org.osgi.service.cm.ManagedServiceFactoryインターフェイスで提供されていますが、プロキシされていますこれは、ブローカの最も遅い開始コネクタを介してプログラム/プログラムを使って接続/セッション/一時待ち行列を作成しようとするというループを繰り返す機能を作成してしまいました。私の場合はsslコネクタ)、次にすべてを削除/閉じる。その後、この機能はプログラムで他の機能をインストールします。

これは機能します。

基本的には:

// ... setup amq conn factory 
while (true) { 
    Thread.sleep(5000L); 
    try { 
    amqConnFactory.createConnection() 
        .start() 
        .createSession(fals‌​e, Session.AUTO_ACKNOWLEDGE) 
        .createTemporaryQueue(); 
    break; 
    } catch (Exception e) { 
    // debug log 'not up yet' 
    } 
} 
+0

私はまた、その後にそのプロセスを接続して起動している場合、私は、ブローカーがアップしているかどうかを確認する必要があり、同様の問題に直面しています。あなたはあなたのソリューションを親切に共有できますか? – CoderX

+0

私はコードを明示的に共有することはできませんが、それほど精巧ではありません。基本的に: //セットアップamq connファクトリ while(true){ Thread.sleep(5000L); try {amqConnFactory.createConnection()。start()。createSession(false、Session.AUTO_ACKNOWLEDGE).createTemporaryQueue(); 休憩。 } catch(例外e){ //デバッグログ 'not up yet' } –

+0

コメントフォーマットについてごめん... @CoderXを見るのに苦労しない付随的な回答を投稿しようとします。 –

関連する問題