使用JMSMessageID从MQ Queue中删除JMS消息

时间:2012-08-09 15:50:41

标签: java jms ibm-mq mq

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

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

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

2 个答案:

答案 0 :(得分:4)

当您使用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);

答案 1 :(得分:0)

如何使用messageid删除特定邮件表单队列?

我也喜欢你的问题,我提供了可恢复的功能。您只需要传递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