java - 如何让MessageListener在收到某条消息后停止监听JMS中的消息?

标签 java jms message-listener

我有一个正在接收一些 TextMessages 的消息监听器。当它收到 ObjectMessage 时,我希望它停止收听队列。我的问题是,当我在 onMessage(Message msg) 方法中调用 consumer.close() 时,ObjectMessage 似乎没有从队列中删除。如果我使用一些标记告诉消费者在 onMessage() 方法之后关闭,那么监听器可能会在它实际关闭之前使用另一条消息。有什么建议么?这是一些代码。 Session、Connection 和 InitialContext 尚未关闭。

public class MyListener implements MessageListener{
    MessageConsumer consumer;

    public MyListener(MessageConsumer mc){
        consumer = mc;
    }

    @Override
    public void onMessage(Message msg) {
        try{
            if(msg instanceof ObjectMessage){
                consumer.close();
            }
            if (msg instanceof TextMessage){
                TextMessage tmsg = (TextMessage) msg;
                String xml = tmsg.getText();
                // do some stuff                
            }

       }catch(Exception e){
           e.printStackTrace();
       }
    }

最佳答案

不要使用异步MessageListener

而是在循环中的主线程中使用普通的同步 receive 方法。如果您收到特殊消息,您可以确认并跳出循环以关闭 session 并终止程序。

关于java - 如何让MessageListener在收到某条消息后停止监听JMS中的消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18787939/

相关文章:

java - 使用 Commons IO 将目录压缩成一个 zipfile

performance - 是否有任何工具可以优化 JMS 队列上的消费者和生产者线程的数量?

java - JMS 生产者/消费者/代理如何确保/确认消息已发送/传递/消费/处理

java - Google App Engine Channel API 配额列表?

java - 为什么 GWT 的编辑器框架中的子编辑器需要包私有(private)?

java - 为什么JNDI资源在Tomcat中只能被调用一次?

jms - 代理的 activemq 静态网络是否停止转发消息而未启用advisorySupport?

rest - 文件转换服务的有效 REST 方法是什么?

java - JMS 队列上多线程消息处理的最佳实践

activemq - 如何捕获 MessageListener 内引发的 ActiveMQ 线程异常