【问题标题】:not able to remove message from jms activemq queue无法从 jms activemq 队列中删除消息
【发布时间】:2018-06-18 22:05:58
【问题描述】:

我是 jms 技术的新手。我正在使用activeMQ 控制台来监控队列。我可以创建包含消息的队列。但是当我尝试删除某些队列时..一个例外来了。尝试了很多东西,但一切都在脉络..下面是我的代码:

代码

   BrokerService brokerService = new BrokerService();
        try {
            brokerService.start(true);
            brokerService.start();
            brokerService.autoStart();
            brokerService.setUseJmx(true);
            brokerService.addConnector("tcp://localhost:61616");
            Thread.sleep(10000);
            System.out.println("brokerService : "+brokerService.isStarted());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


        BrokerFacadeSupport facade=   new LocalBrokerFacade(brokerService);
        try {
            QueueViewMBean queue = facade.getQueue(queue_name);
            if(queue==null) {
                System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
            }
                    int count = this.jmsTemplate.browse(queue_name, new BrowserCallback<Integer>() {
                public Integer doInJms(final Session session, final QueueBrowser browser) throws JMSException {
                    Queue queue1 = browser.getQueue();
                    Enumeration enumeration = browser.getEnumeration();
                    int counter = 0;
                    while (enumeration.hasMoreElements()) {
                        Message msg = (Message) enumeration.nextElement();
                        msg.acknowledge();
                        ActiveMQTextMessage atm  = (ActiveMQTextMessage) msg;
                        atm.setDroppable(true);
                        atm.setReadOnlyProperties(false);
                        atm.setReadOnlyBody(false);
                        atm.acknowledge();
                        msg.setBooleanProperty("readOnlyProperties", false);
                                    msg.setBooleanProperty("readOnlyBody", false);
                                    msg.setBooleanProperty("droppable", true);
                        Enumeration enum_ = atm.getPropertyNames();
                        while(enum_.hasMoreElements()) {
                            String name  = (String) enum_.nextElement();
                            System.out.println("## : "+name);
                        }
                        try {
                            System.out.println("--"+atm.getJMSMessageID());
                            System.out.println();
                            queue.removeMessage(atm.getJMSMessageID());
                        }catch(Exception ex) {
                            ex.printStackTrace();
                        }
                        System.out.println(String.format("\tFound : %s", msg));
                        counter += 1;
                    }
                    return counter;
                }
            });
            queue.purge();
        }catch(Exception ex) {
            ex.printStackTrace();
        }

输出

输出到System.out.println(String.format("\tFound : %s", msg)); 是:

Found : ActiveMQTextMessage {commandId = 5, responseRequired = true, messageId = ID:CRM-PC-50101-1528866712471-1:1:1:1:1, originalDestination = null, originalTransactionId = null, producerId = ID:CRM-PC-50101-1528866712471-1:1:1:1, destination = queue://testNexus, transactionId = null, expiration = 0, timestamp = 1528866713408, arrival = 0, brokerInTime = 1528866713410, brokerOutTime = 1529047482640, correlationId = null, replyTo = null, persistent = true, type = null, priority = 4, groupID = null, groupSequence = 0, targetConsumerId = null, compressed = false, userID = null, content = org.apache.activemq.util.ByteSequence@12b82970, marshalledProperties = org.apache.activemq.util.ByteSequence@49abe550, dataStructure = null, redeliveryCounter = 0, size = 0, properties = {_type=com.crm.jms.SampleObject}, readOnlyProperties = true, readOnlyBody = true, droppable = false, jmsXGroupFirstForConsumer = false, text = {"msg":"hello world"}}

最终输出控制台

==>   _type : com.crm.jms.SampleObject
--ID:Crm-PC-50101-1528866712471-1:1:1:1:1
java.lang.NullPointerException
    at com.crm.jms.controller.QueueController$1.doInJms(QueueController.java:171)
    at com.crm.jms.controller.QueueController$1.doInJms(QueueController.java:1)
    at org.springframework.jms.core.JmsTemplate$14.doInJms(JmsTemplate.java:1033)
    at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:484)
    at org.springframework.jms.core.JmsTemplate.browseSelected(JmsTemplate.java:1027)
    at org.springframework.jms.core.JmsTemplate.browse(JmsTemplate.java:989)
    at com.crm.jms.controller.QueueController.deleteQueue(QueueController.java:153)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
.
.
.
.
    Found : ActiveMQTextMessage {commandId = 5, responseRequired = true, messageId = ID:Crm-PC-50101-1528866712471-1:1:1:1:1, originalDestination = null, originalTransactionId = null, producerId = ID:Crm-PC-50101-1528866712471-1:1:1:1, destination = queue://testNexus, transactionId = null, expiration = 0, timestamp = 1528866713408, arrival = 0, brokerInTime = 1528866713410, brokerOutTime = 1529049245130, correlationId = null, replyTo = null, persistent = true, type = null, priority = 4, groupID = null, groupSequence = 0, targetConsumerId = null, compressed = false, userID = null, content = org.apache.activemq.util.ByteSequence@5b55f70f, marshalledProperties = org.apache.activemq.util.ByteSequence@3e116ae6, dataStructure = null, redeliveryCounter = 0, size = 0, properties = {_type=com.crm.jms.SampleObject}, readOnlyProperties = true, readOnlyBody = true, droppable = false, jmsXGroupFirstForConsumer = false, text = {"msg":"hello world"}}
java.lang.NullPointerException
    at com.crm.jms.controller.QueueController.deleteQueue(QueueController.java:181)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
.
.
.
.

【问题讨论】:

  • 不可能将堆栈跟踪与您粘贴的没有行号的代码相关联。让整个 com.crm.jms.controller.QueueController 类更容易理解堆栈跟踪也将有所帮助。
  • 你看我遇到的问题是在这一行:QueueViewMBean queue = facade.getQueue(queueName); ...这里队列是null,所以无论我调用removeMessage还是purge方法,都给@987654331 @.
  • 你能分享 QueueController 类吗?一个 git 也有帮助

标签: java jms activemq jmstemplate


【解决方案1】:

您为什么要确认您正在浏览(而不是消费)的消息?

Enumeration enumeration = browser.getEnumeration();
...
Message msg = (Message) enumeration.nextElement();
msg.acknowledge();

正如您所注意到的,在 javax.jms.Queue 上确实没有 delete()/remove() 方法,但是您可以通过使用所需的消息(仍然使用纯 JMS API)来达到相同的结果:

MessageConsumer consumer = session.createConsumer(myQueue, "JMSMessageID = '" + messageId + "'");
Message message = consumer.receive(TIMEOUT);
message.acknowledge();

【讨论】:

  • 你看我遇到的问题是在这一行:QueueViewMBean queue = facade.getQueue(queueName); ...这里队列是null,所以无论我调用removeMessage还是purge方法,都给@987654327 @.
  • 你的 'queueName' 变量是哪个值?
  • 这就是重点:进入方法时 queueName 的实际值是多少?错误的值可能是找不到队列的原因。特别是 JMS api(例如 session.createConsumer)所需的确切 queueName 可能与本机 ActiveMQ api(例如 facade.getQueue)所需的不同。例如:“queue/myqueue”与“myqueue”
  • 看,我可以从 queueName.. 获取消息 ID。然后我想从给定队列中删除该消息。
【解决方案2】:

问题在于您没有启动BrokerService,因此facade.getQueue(queueName) 方法将返回null。为什么?因为外观对象不知道您要的是哪个活动的 mq 服务器。

当然,因为您正在使用jmsTemplate 连接到正在运行的代理服务器,所以您会获得一些关于您的消息的信息。

queue.purge();queue.removeMessage(msg.getJMSMessageID()); 上抛出异常,因为queuenull

我建议删除BrokerServiceBrokerServiceFacade 的东西,并通过browser.getQueue() 方法从QueueBrowser 参数中获取回调中的Queue 对象。

【讨论】:

  • 好的,但是browser.getQueue() 对象,即javax.jms.Queue 没有可用的删除方法..
  • brokerService.start() 也已经启动了 brokerService 但queue 仍然为空
  • 您是否使用 broker.setUseJmx(true)broker.addConnector("tcp://localhost:PORT"); 启动代理?因为没有指定 url 代理将开始使用您的 JVM。
  • 对不起,朋友,它仍然没有初始化队列..队列对象仍然是 null 无论如何,我已经用你让我做的所有更正更新了我的问题..请查看/批准代码上面看看我是否做得对..谢谢你的努力。
猜你喜欢
  • 1970-01-01
  • 2018-09-28
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
  • 2017-07-05
  • 1970-01-01
  • 2013-09-30
  • 2014-09-17
相关资源
最近更新 更多