JMS中,消息选择器允许消费者根据特定的条件选择性地接收消息。这种选择器类似于使用类似于SQL的语法来为消费者定义筛选条件,只有满足这些条件的消息才会被消费者接收。
下面我们直接看一段例子代码,它使用消费选择器选择性的接收设置了指定属性(Property)的消息。
package com.gacfox.demo.demoweb;
import javax.annotation.Resource;
import javax.jms.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "ProducerServlet", urlPatterns = "/producer")
public class ProducerServlet extends HttpServlet {
@Resource(lookup = "java:/ConnectionFactory")
private ConnectionFactory connectionFactory;
@Resource(lookup = "java:/jms/queue/DemoQueue")
private Queue queue;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try (JMSContext context = connectionFactory.createContext()) {
JMSProducer producer = context.createProducer();
TextMessage textMessage = context.createTextMessage("Hello, JMS!");
textMessage.setStringProperty("prop1", "ABC");
textMessage.setIntProperty("prop2", 10);
producer.send(queue, textMessage);
} catch (JMSException e) {
throw new RuntimeException(e);
}
}
}
消息生产者中,我们调用了message.setStringProperty()
和message.setIntProperty()
方法为消息设置了一些属性。
package com.gacfox.demo.demoweb.listerner;
import javax.annotation.Resource;
import javax.jms.*;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class DemoListener implements ServletContextListener {
@Resource(lookup = "java:/ConnectionFactory")
private ConnectionFactory connectionFactory;
@Resource(lookup = "java:/jms/queue/DemoQueue")
private Queue queue;
private JMSContext context;
@Override
public void contextInitialized(ServletContextEvent sce) {
context = connectionFactory.createContext();
String messageSelector = "prop1='ABC' AND prop2=10";
JMSConsumer consumer = context.createConsumer(queue, messageSelector);
consumer.setMessageListener(message -> {
try {
TextMessage textMessage = (TextMessage) message;
System.out.println(textMessage.getText());
} catch (JMSException e) {
throw new RuntimeException(e);
}
});
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
if (context != null) {
context.close();
}
}
}
消息消费者中,我们使用消息选择器筛选了消息,筛选条件为字符串prop1
值为ABC
,整数prop2
值为10
,只有符合指定属性的消息才会被该消费者接收。不过这里要注意,没有被该消费者消费的消息并没有消失,它们仍在队列中,如果有能够接收它们的消费者,那些被筛选掉的消息仍能被正常消费。