【问题标题】:Remove a JMS message from MQ Queue using JMSMessageID使用 JMSMessageID 从 MQ 队列中删除 JMS 消息
【发布时间】:2014-07-25 23:11:49
【问题描述】:

有没有办法使用 Java 应用程序中的 JMSMessageId(不使用工具)从 IBM MQ 队列中删除 JMS 消息?此类操作是否也是特定于供应商的?

查看了用于删除消息的接收操作的API,但是对于删除特定消息,我们是否需要使用MessageSelector进行过滤并适当地删除,还是有更简单的方法? [检查任何可以直接使用的可用方法]

您能否提供教程/示例 [也可以是链接] 以显示此类操作的 API 使用情况?

【问题讨论】:

    标签: java jms ibm-mq mq


    【解决方案1】:

    当您使用JMSMessageID 作为选择器中的唯一消息属性时,WMQ 将查找优化为与通过队列中的索引字段MQMD.MessageID 获取的本机 WMQ API 相同。请参阅JMS Message Selection 主题了解更多详情。

    QueueReceiver rcvr = sess.createReceiver(inputQ, "JMSCorrelationID = '"+msgId+"'")
    

    您也可以使用 Java 本机代码使用本机 WMQ API 调用来执行相同的操作。您将执行正常的 GET 操作,但在 MQMD 结构中指定消息 ID。

    myMsg.messageId = someMsgID; 
    MQGetMessageOptions gmo = new MQGetMessageOptions(); 
    myQueue.get(myMsg, gmo);
    

    【讨论】:

    • 谢谢罗伯。已编辑的问题。我的意思是它很简单(在程序员看来)。
    • 我从来没有遇到过简单的程序员。 ;-)
    • :) 又搞错了!简单的代码 - 可读,重点,重用可用的实用程序/API。
    【解决方案2】:

    如何使用messageid删除特定的消息表单队列?

    我也有和你一样的问题,我提供了resuable功能。您只需要传递MessageIdQueue 名称。对我来说没问题。

    private void deleteMessage(String messageId, String queueName) {
        try {
             JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi");
             JMXConnector jmxc = JMXConnectorFactory.connect(url);
             MBeanServerConnection conn = jmxc.getMBeanServerConnection();
             ObjectName name = new ObjectName("org.apache.activemq:type=Broker,brokerName=localhost");
             BrokerViewMBean proxy = (BrokerViewMBean)MBeanServerInvocationHandler.newProxyInstance(conn, name, BrokerViewMBean.class, true);
             for (ObjectName queue : proxy.getQueues()) {  
                QueueViewMBean queueBean = (QueueViewMBean) MBeanServerInvocationHandler.newProxyInstance(conn, queue, QueueViewMBean.class, true);
                if(queueBean.getName().equals(queueName)) {
                    System.out.println("Deleted : " + messageId);
                    queueBean.removeMessage(messageId);
                    return;
                }
             }
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
    

    我使用activemq-all-5.8.0.jar

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-05
      • 2015-02-02
      • 2018-03-14
      相关资源
      最近更新 更多