2012-04-24 10 views
1

メッセージプロパティとして日付/時刻を持つキューにメッセージを配置し、そのプロパティが現在の日付に関する基準を満たしているときにキューからメッセージをプルしたいとします。JMSメッセージセレクタの現在の日付と比較できますか?

例として、3時にメッセージを消費したいとします。私の考えは、プロパティを3:00に設定し、event_timestamp <= CURRENT_TIMESTAMPのようなメッセージセレクタを持つことです。

私は、JMS APIのメッセージセレクタはSQLに基づいていることを理解し、私は私がCURRENT_TIMESTAMPまたはNOW()などのキーワードを持っているかもしれませんデータベース、等を問い合わせるような方法であることを利用したいと思います。メッセージセレクタの式の構文に似たものがありますか、このような結果を得る別の方法はありますか?

答えて

2

私が知る限り、JMS仕様ではセレクタに使用できる機能はありません。おそらく、ベンダー固有の実装拡張に存在するものもありますが、the message selector referenceによるtibcoでは存在しないものがあります。

メッセージセレクタは、特定のMessageConsumerための固定パラメータであるため、あなたは現在の日付(または何でも)を使用してselector文字列を作るために持っているとSession.createConsumerSession.createDurableSubscriberまたはSession.createBrowserを呼び出すたびに、このセレクタクエリの変更。

すべての消費者が同じパフォーマンスを維持できるように、同じ接続とセッションを維持することをお勧めします。

もう1つの方法は、メッセージブラウザを使用してメッセージのプロパティを開いて条件を計算し、それが効果的に消費することを決めるが、このアイデアは間違いなく定期的なポーリングであり、メッセージングの哲学を破ることです。

私は、あなたが定義されたタイムスタンプの後で将来的に処理するためのメッセージを投稿すると思います。おそらく、メッセージの有効期限のおかげで要件を実装する別の方法があります。一般に、期限切れのメッセージをキューAから別のキューBに移動するようにブローカを設定することができます。つまり、コンシューマはキューBで期限切れになったメッセージをリッスンします。

0

メッセージのユーザー定義プロパティには何も入れることができます。例えば、ユーザープロパティーMyTimeStampとプロパティーの値が3.00と設定されている場合は、セレクターをMyTimeStamp='3.00'とすることができます。メッセージは待ち行列に到着するとすぐに待機中のコンシューマに配信されます。これは、システム時間が3時のときにメッセージが消費者に配信されることを意味しません。

+0

右の期限が切れるので、質問のポイントは、私はむしろ、いくつかの事前定義された時間よりも、現在の時間にどのように比較することができたとき、メッセージが「見える」となります ... – Ray

0

Unixの時間/エポック時間(1970年から#秒)のJMSTimestampを使用できます。これは長いです。

私はこれを試していませんでしたが、簡単です。

+1

あなたは、いくつかを提供することもできます比較を行う方法を示すコード – Cyril

1

サーバーがJMS 2.0に準拠している場合は、配信遅延機能を使用します(JMSProducer.setDeliveryDelay(long deliveryDelay))。
メッセージをキューに入れるときは、希望する時間まで遅延を計算します。
遅延が JMS 2.0 new features

関連する問題