Websphere MQ では、メッセージが到着したときにアプリケーションをトリガーするようにキューを構成できます。
そうすれば、必要な場合にのみ起動するアプリケーションを作成でき、そのキューでメッセージを待機するデーモンを 1 つ管理する必要がなくなります。
詳しくはこちら
この機能を提供するオープン ソースの JMS プロバイダはありますか?
ActiveMQ を試しましたが、トリガーがありません。
qpid には、websphere-MQ のようなモニター トリガー機能はありません。ActiveMQ もそうではないことを私は知っています。これは他の JMS プロバイダーにも当てはまるのではないかと思います。ただし、独自のモニタートリガーをロールアウトすることは可能です。
自作のモニタートリガーは、管理する必要があるアプリケーションプロセス(軽量ではありますが)になりますが、実際のアプリケーションスレッド自体を管理する方がよいでしょうか?
JMS 仕様では、非同期配信モードが定義されています。セクション 4.5.2 を参照してください。したがって、これは任意の JMS プロバイダーで実行できるはずです。非同期リスナーはインターフェースを実装しjavax.jms.MessageListener
ます。メソッドonMessage()
を実装する必要があり、サブスクライブ先のキューに新しいメッセージが表示されたときにコールバック関数として機能します。
メイン アプリケーション キューが であるとしますmainQ
。mainQ からのメッセージを実際に消費しないように、ブラウズ モードで新しいMessageListener
for を作成します。mainQ
Destination mainQ = (Destination) session.createQueue("mainQ; {mode: browse}");
MessageConsumer mainQConsumer = session.createConsumer(mainQ);
mainQConsumer.setMessageListener(this);
onMessage()
関数では、別のメッセージを作成するか、このtriggerQ
手順をスキップしてアプリケーションをすぐに起動できます。
public void onMessage(Message message)
{
TextMessage triggerMessage = session.createTextMessage("Trigger-start-Application-X");
Destination triggerQ = (Destination) session.createQueue("triggerQ");
triggerQProducer = session.createProducer(triggerQ);
this.triggerQProducer.send(triggerMessage);
// Or alternatively:
// if (!applicationIsActive()) activateApplication()
}
ここで完全な作業サンプルを参照してください: https://github.com/foragerr/qpid-trigger-demo