消息选择器

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,只有符合指定属性的消息才会被该消费者接收。不过这里要注意,没有被该消费者消费的消息并没有消失,它们仍在队列中,如果有能够接收它们的消费者,那些被筛选掉的消息仍能被正常消费。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap