我的ejb-jar.xml包含<message-selector> destinationInstance IN(a', 'b','c')</message-selector>.
我们如何在独立的java程序中实现消息选择器。
JMSMessageListener
已在队列中注册,只要队列中有消息,就会调用onMessage
侦听器方法。
我试过这个。?它有用......
public void messageSelector(){
List<String> url=StCotants.getUrls();
for(String obj:url){
ConnectionFactory factory = new ActiveMQConnectionFactory(obj);
System.out.println(factory);
try{
Connection connection = factory.createConnection();
connection.start();
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue("queue");
MessageConsumer consumer = session.createConsumer(queue,"destinationInstance IN('a', 'b','c')");
XyzMDBClient xyzClientlistener=new XyzMDBClient();
consumer.setMessageListener(xyzClientlistener);
}
catch(Exception e){
e.printStackTrace();
}
}
答案 0 :(得分:0)
创建使用者时,可以将选择器作为第二个参数提及 session.createConsumer(queue,&#34; destinationInstance IN(&#39; a&#39;,&#39; b&#39;&#39; c&#39;)&#34;) session.setMessageListener(...)
答案 1 :(得分:0)
回到过去,我一直在寻找有关如何使用消息选择器的示例,我发现此站点非常有用:How to use Message Selectors to filter messages
关于什么是选择器以及如何使用它们的非常简洁的文章。
消息选择器使您可以过滤MessageConsumer将接收的消息。筛选器是一种相对复杂的语言,它模仿SQL WHERE子句的语法。选择器可以使用所有消息头和属性进行过滤,但不能使用消息内容。 选择器最适用于向订户广播大量消息的主题。
选择器的工作方式取决于目标类型:
*在 队列 上,仅返回与选择器匹配的消息。其他人则留在队列中(因此可以由具有不同选择器的MessageConsumer读取)。
*在 主题 上,与选择器不匹配的消息将被忽略,就像尚未发布一样。 为了创建选择,您需要将其传递给createConsumer或createDurableSubscriber调用:
代码示例:
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')");