如何使用消息选择器过滤消息在JMS中

时间:2016-08-10 05:58:04

标签: java jms

我的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();

        }

    }

2 个答案:

答案 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')");