簡體   English   中英

使用JMSMessageID從MQ Queue中刪除JMS消息

[英]Remove a JMS message from MQ Queue using JMSMessageID

有沒有辦法在Java應用程序中使用JMSMessageId從IBM MQ隊列中刪除JMS消息(不使用工具)? 此類操作也是特定於供應商的嗎?

通過API查看用於刪除消息的接收操作,但是為了刪除特定消息,我們是否需要使用MessageSelector進行過濾並適當刪除,還是有更簡單的方法? [檢查可以直接使用的任何可用方法]

您能否提供教程/示例[也可以是鏈接]來顯示此類操作的API使用情況?

當您使用JMSMessageID作為選擇器中唯一的消息屬性時,WMQ將查找優化為與MQMD.MessageID獲取的本機WMQ API相同, MQMD.MessageID是隊列中的索引字段。 有關更多詳細信息,請參閱JMS消息選擇主題。

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

您也可以使用Java本機代碼使用本機WMQ API調用執行相同的操作。 您可以執行正常的GET操作,但在MQMD結構中指定消息ID。

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

如何使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM