3

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

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

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

4

2 回答 2

4

当您JMSMessageID用作选择器中的唯一消息属性时,WMQ 将查找优化为与本机 WMQ API 相同,MQMD.MessageID后者是队列中的索引字段。有关更多详细信息,请参阅JMS 消息选择主题。

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

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

myMsg.messageId = someMsgID; 
MQGetMessageOptions gmo = new MQGetMessageOptions(); 
myQueue.get(myMsg, gmo);
于 2012-08-09T16:17:42.433 回答
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.

于 2014-07-25T15:11:49.767 回答