3

ActiveMQ 5.5 と JMS を使用しています。のメッセージセレクターを持つトピックコンシューマーを作成しました

key<>'aValue'

つまり、消費者は、値「aValue」を持たない「key」というプロパティを持つメッセージのみを受信します。

次に、「キー」というプロパティのないメッセージを送信します (null 値のプロパティがある場合ではなく、プロパティがないことに注意してください)。

私を困惑させているのは、メッセージが配信されているということです。

これは、演算子 NOT LIKE を使用する場合には当てはまりません:

key NOT LIKE 'aVal%'. 

この場合、コンシューマーはメッセージを受け取りません。これは私の中で矛盾しています。

これは、JMS 仕様に次のように記載されています。

メッセージ セレクターは、メッセージのヘッダー フィールドとプロパティ値がセレクター内の対応する識別子に置き換えられたときに、セレクターが true と評価されたときにメッセージと一致します。

SQL92 仕様 (JMS メッセージ セレクターの構文が基づいている) によると、何かを NULL と比較すると、値 (この場合は TRUE または FALSE) ではなく NULL になります。この場合、最初のケースでメッセージが受信されることはありません。

誰もこれに出くわしましたか?プロデューサーがプロパティを指定せず、コンシューマーがセレクターを持っている場合、<> の場合と NOT LIKE の場合のどちらの結果が正しいですか? これを回避する方法はありますか?

4

1 に答える 1

3

私の限られた読書に基づいて、私の理解は次のとおりです。最初に JMS 仕様から:

メッセージに存在しないプロパティが参照された場合、その値は NULL です。

したがって、あなたの場合、プロパティ値に置き換えられたキー識別子は NULL と評価されます

最初の式は基本的に NULL<>'aValue' になります。これは私の考えでは当てはまります。

2 番目の式は NULL NOT LIKE '%aVal' になり、仕様では結果が不明であり、ActiveMQ は結果として true を使用しているようです。

LIKE または NOT LIKE 操作の識別子が NULL の場合、操作の値は不明です。

修正は、セレクターを非常に明示的にすることだと思います。

(key NOT NULL) AND ...
于 2012-09-15T04:18:01.387 に答える