Message selectors allow an MDB to be more selective about the messages it receives from a particular topic or queue. Message selectors use Message
properties as criteria in conditional expressions. These conditional expressions use Boolean logic to declare which messages should be delivered to a client.
With MDB 3.0 it’s easier to configure a selector : simply add an @ActivationConfigProperty at the top of your MDB:
@MessageDriven(activationConfig = { @ActivationConfigProperty(propertyName = "messageSelector",propertyValue = "color= 'red'")} ) public class Mdbsample implements MessageListener { ... }
Using an MDB Selector in XML descriptors
If you don’t want to include in your code the Selector info, you can also specify it in the ejb-jar.xml configuration file. See this example:
<ejb-jar> <display-name>DemoMDB</display-name> <enterprise-beans> <message-driven> <display-name>testMdb</display-name> <ejb-name>DemoMDB</ejb-name> <ejb-class>DemoMDB</ejb-class> <transaction-type>Container</transaction-type> <message-selector>RECIPIENT='MDB'</message-selector> <message-driven-destination> <destination-type>javax.jms.Queue</destination-type> </message-driven-destination> <resource-ref> <description>description</description> <res-ref-name>jms/myQueueConnectionFactory</res-ref-name> <res-type>javax.jms.QueueConnectionFactory</res-type> <res-auth>Application</res-auth> <res-sharing-scope>Shareable</res-sharing-scope> </resource-ref> <resource-env-ref> <resource-env-ref-name>jms/persistentQueue</resource-env-ref-name> <resource-env-ref-type>javax.jms.Queue</resource-env-ref-type> </resource-env-ref> </message-driven> </enterprise-beans> <assembly-descriptor> <container-transaction> <method> <ejb-name>DemoMDB</ejb-name> <method-name>onMessage</method-name> <method-params> <method-param>javax.jms.Message</method-param> </method-params> </method> <trans-attribute>Required</trans-attribute> </container-transaction> </assembly-descriptor> </ejb-jar>
Setting a Message Selector programmatically
You can also set a Selector on your Producer by setting a String property as follows:
Connection connection = connectionFactory.createConnection(); Session session = connection.createSession(true, 0); Message message = session.createMessage(); message.setStringProperty("color", "yellow"); JMSProducer producer = context.createProducer(); producer.send(queue, message);
How to define a Selector at Queue level
Finally, it is worth mentioning that the messaging-activemq subsystem (available in WildFly / JBoss EAP 7) also allows to define a selector for your destination. To do that, set the filter attribute of your destination as shown here:
<subsystem xmlns="urn:jboss:domain:messaging-activemq:1.0"> ... <queue name="myQueue" filter="color='red'" /> ... </subsystem>
You can set the filter when you are creating your Queue as in this example:
jms-queue add --queue-address=QUEUE_ADDRESS --selector=FILTER_EXPRESSION