4.メッセージオブジェクトとフィルタリング
2006.12.01 株式会社四次元データ 宮澤了祐
- 4.1. メッセージオブジェクト
- 4.2. メッセージのフィルタリング
4.1.メッセージオブジェクト
JMSではjavax.jms.TextMessageオブジェクト以外にもさまざまなメッセージオブジェクトを持っています。 全てのメッセージオブジェクトはjavax.jms.Messageを実装したクラスで、登録出来るデータによって種類が分かれます。
メッセージオブジェクトは
- ヘッダー
- プロパティ
- ボディ
の三つの構造で成り立っています。
ヘッダー部はメッセージに関するいくつかの情報が記録されています。自動で設定されるものと、設定しなければならないものがあります。JMSで定義されているヘッダー情報は次があります。
ヘッダーフィールド | 説明 |
---|---|
JMSDestination | メッセージを送信する送信先オブジェクトの名前を指定します。(JMSサーバが設定する) |
JMSDeliveryMode | メッセージが持続かどうかを指定します。(デフォルトでJMSサーバが設定するか、MessageProducerまたは個々のメッセージごとにクライアントが明示的に設定する) |
JMSExpiration | メッセージの有効期限を指定します。(デフォルトでJMSサーバが設定するか、MessageProducerまたは個々のメッセージにごとにクライアントが設定する) |
JMSPriority | 0 (低) から 9 (高) の範囲内で、メッセージの優先度を指定します。(デフォルトでJMSサーバが設定するか、MessageProducerまたは個々のメッセージごとにクライアントが明示的に設定する) |
JMSMessageID | プロバイダのインストールのコンテキスト内で、メッセージに対する一意の ID を指定します。(JMSサーバが設定する) |
JMSTimestamp | プロバイダがメッセージを受信した時間を指定します。(JMSサーバが設定する) |
JMSCorrelationID | クライアントが 2 つのメッセージのやりとりを定義できるようにするための値です。(必要に応じてクライアントが設定する) |
JMSReplyTo | MessageConsumerが応答を送信すべき送信先を指定します。(必要に応じてクライアントが設定する) |
JMSType | メッセージセレクタが評価できる値です。(必要に応じてクライアントが設定する) |
JMSRedelivered | メッセージがすでに配信されたが通知されていないかどうかを指定します。(JMSサーバが設定する) |
ヘッダの値は、MessageオブジェクトのgetJMSXXX()/setJMSXXX()メソッドで取得・また設定することが出来ます。
プロパティ部には、使用者が自由に設定したプロパティが保存されています。プロパティはプロパティ名と値のセットで設定されています。 Boolean,Byte,Double,Float,Int,Short,String,Objectオブジェクトをプロパティに登録することが出来ます。
プロパティを使用することで、後述するメッセージフィルタリングを行うことが出来ます。
ボディ部はメッセージの本体部です。 送信したオブジェクトによって違うクラスを使用します。 JMSで用意されているメッセージクラスには次のものがあります。
- Message ヘッダとプロパティのみで構成されるメッセージ。
- StreamMessage ボディ部がストリームで作成されています。そのためwrite()メソッドやread()メソッドでメッセージを読み書きすることが出来ます。
- TextMessage 文字列をボディ部に設定します。setText()メソッドで設定することが出来ます。
- MapMessage オブジェクトに対応した名前を設定することの出来るMapをボディに設定できます。
- ByteMessage java.io.DataInputStreamやjava.io.DataOutputStreamのようなByte型のストリームをボディ部に持ちます。
- ObjectMessage javaオブジェクトをボディ部に設定することが出来ます。
4.2.メッセージのフィルタリング
JMSでは、メッセージの受信の際にフィルタリングを行うことが出来ます。
メッセージのヘッダーに記録されたJMS固有のプロパティに加え、setXXXProperty()メソッドで設定したプロパティに対して条件を設定することが出来ます。 例えば、"from"というプロパティに送信者の名前が記録されているとします。 送信者が"四次元太郎"からの場合はメッセージを受け取る場合、次のように設定します。
(受信側) String selector = "from = '四次元太郎'"; QueueSession session = ...; QueueReceiver reciver = session.createReceiver(queue,selector); TopicSession session = ...; TopicSubscriber receiver = session.createSubscriber(topic,selector); (送信側) TextMessage msgFromTarou = session.createTextMessage("message from 四次元太郎"); msgFromTarou.setStringProperty("from","四次元太郎"); TextMessage msgFromJirou = session.createTextMessage("message from 四次元次郎"); msgFromTarou.setStringProperty("from","四次元次郎");
セッションオブジェクトからMessageConsumerを作成する際にセレクターを設定することが出来ます。 セレクターはtrueまたはfalseを返す条件式の形で設定します。条件式がtrueであればMessageConsumerがメッセージを受信します。
また、複数の条件を登録することも出来ます。
String selector = "from = '四次元太郎' OR brother = '四次元太郎'"; ...(略) (送信側) TextMessage msgFromTarou = session.createTextMessage("message from 四次元太郎"); msgFromTarou.setStringProperty("from","四次元太郎"); TextMessage msgFromJirou = session.createTextMessage("message from 四次元次郎"); msgFromTarou.setStringProperty("brother","四次元太郎");
OR演算子を使い、四次元太郎か四次元次郎からのメッセージであれば受信する設定になっています。
セレクタで使うことの出来る演算子
セレクタ内で使用することの出来る演算子の一覧です。 セレクタはSQLに似た構文で作られています。
NOT | 式を否定します。 |
AND | 式と式が両方trueであればtrueを返します。 |
OR | どちらかの式がtrueであればtrueを返します。 |
() | 式の実行順番を設定します。 |
=,<,>,<=,>=,<> | 比較演算子です。 |
*,/ | 乗算、除算を行います。プロパティが数値である必要があります。 |
+,- | 加算、減産を行います。プロパティが数値である必要があります。 |
BETWEEN (値1) AND (値2) | プロパティが値1と値2の間であればtrueを返します。 「prop BETWEEN 10 AND 20」は 「prop > 10 AND prop < 20」と同義です。 |
IN(値1,値2,....) | プロパティが()で指定した値のどれかであればtrueを返します。 「prop IN('山','川','海')」は「prop == '山' OR prop == '川' OR prop == '海'」と同義です。 |
LIKE | LIKEは文字列比較です。「_」で任意の一文字を表し、「%」で任意の複数の文字を表します。 例えば「prop LIKE 'ab%defg'」は「abcdefg」でも「abccccccdefg」でもtrueを返しますが 「prop LIKE 'ab_defg'」は「abcdefg」には当てはまりますが「abccccccdefg」には当てはまりません。 また、「ESCAPE '(任意の一文字)'」を使用することでエスケープ文字を設定することが出来ます。 これを使うことで「_」と「%」を比較対照とすることが出来ます。 例として「prop LIKE '12\%34' ESCAPE '\'」は「12%34」という文字列とマッチします。 |
IS NULL | プロパティが null であればtrueを返します。 |
IS NOT NULL | プロパティが null でなければtrueを返します。 |
文字列は「'(シングルコーテーション)」で囲む必要があります。 また、不適切なセレクタを設定した場合はjavax.jms.InvalidSelectorExceptionが投げられます。