Message Selectors 是用来过滤接受者接收信息的,语法类似SQL的语法。
可使用Message的属性,不能用其body部分当作过滤条件。
Selectors 的最大用处是用在过滤Topics,订阅者直接不接受不匹配的信息,感觉这些信息是没发布过的一样。
1.当Queues,接收者只接收匹配的信息,其它留在Queue中。
2。Topics,订阅者直接不接受不匹配的信息,感觉这些信息是没发布过的一样.
In order to create a selection, you need to pass it to the createConsumer or createDurableSubscriber invocation:
Session session = ...
MessageConsumer consumer = session.createConsumer(queue, "releaseYear < 1980");
The following SQL elements are allowed in the filter:
Element | Description | Example Selector |
---|---|---|
Header Fields | Any headers except JMSDestination, JMSExpiration andJMSReplyTo | JMSPriority = 9 |
Properties | Message properties that follow Java identifier naming | releaseYear = 1982 |
String Literals | String literals in single quotes, duplicate to escape | title = 'Sam''s' |
Number Literals | Numbers in Java syntax (int and double) | releaseYear = 1982 |
Boolean Literals | TRUE and FALSE | isAvailable = TRUE |
( ) | Brackets | (releaseYear < 1980) OR (releaseYear > 1989) |
AND, OR, NOT | Logical operators | (releaseYear < 1980) AND NOT (title = 'Thriller') |
=, <>, <, <=, >, >= | Comparison operators | (releaseYear < 1980) AND (title <>'Thriller') |
LIKE | String comparison with wildcards '_' and '%' (more) | title LIKE 'Thrill%' |
IN | Find value in set of strings (more) | title IN ('Off the wall', 'Thriller', 'Bad') |
BETWEEN | Check whether number is in range (both numbers inclusive) (more) | releaseYear BETWEEN 1980 AND 1989 |
IS NULL, IS NOT NULL | Check whether value is null or not null. | releaseYear IS NOT NULL |
*, +, -, / | Arithmetic operators | releaseYear * 2 > 2000 - 20 |
Some more examples of message consumers with selectors:
Session session = ...
MessageConsumer consumer1 = session.createConsumer(queue,
"(releaseYear < 1980) OR (releaseYear > 1989)");
MessageConsumer consumer2 = session.createConsumer(queue,
"(releaseYear BETWEEN 1980 AND 1989) AND title LIKE 'Michael%'");
MessageConsumer consumer3 = session.createConsumer(queue,
"(releaseYear = 1982) OR (title = 'Thriller')");
MessageConsumer consumer4 = session.createDurableConsumer(queue,
"title IN ('Off the wall', 'Thriller', 'Bad')");