Message selectors allow a JMS consumer
to be more selective about the messages it receives from a particular
topic or queue. Message selectors use Message
properties and headers as criteria in conditional expressions. These
conditional expressions use boolean logic to declare which messages
should be delivered to a client.
The message selectors are based on a subset of the SQL-92 conditional
expression syntax that is used in the WHERE
clauses of SQL statements. This section is a detailed exploration of
the message selector syntax.
To illustrate how message selectors are applied, we will consider a
hypothetical message that contains three application properties:
Age
, Weight
, and
LName
. Age
is an
int
, Weight
is a
double
, and LName
is a
String
property. The values of these properties
depend on the message. The message selector is used to obtain only
those messages with property values of interest to the consumer.
An identifier is the part of the expression that is being compared.
For example, the identifiers in the following expression are
Age
, Weight
, and
LName
:
Age
< 30 ANDWeight
>= 100.00 ANDLName
= 'Smith'
Identifiers can be any application-defined, JMS-defined, or provider-specific property, or one of several JMS headers. Identifiers must match the property or JMS header name exactly; identifiers are case sensitive. Identifiers have the same naming restrictions as property names (see Appendix C).
The JMS headers that can be used as
identifiers include JMSDeliveryMode
,
JMSPriority
, JMSMessageID
,
JMSTimestamp
, JMSCorrelationID
,
and JMSType
. The JMSDestination
and JMSReplyTo
headers cannot be used as
identifiers because their corresponding values are
Destination
objects whose underlying value is
proprietary and therefore undefined.
The JMSRedelivered
value may be changed during
delivery. If a consumer uses a message selector where
"JMSRedelivered = FALSE"
, and there was a failure
delivering a message, the JMSRedelivered
flag
might be set to TRUE
.
JMSExpiration
is not supported as an
identifier because JMS providers may choose to implement this value
differently. Some may store it with the message, while others
calculate it as needed.