是否有一種方法可以在Java應用程序(不使用工具)中使用JMSMessageId從IBM MQ隊列中刪除JMS消息?這些操作也是特定於供應商的嗎?使用JMSMessageID從MQ隊列中刪除JMS消息
通過API來查看用於刪除消息的接收操作,但是爲了刪除特定的消息,我們是否需要使用MessageSelector進行過濾並進行適當的刪除,還是有更簡單的方法? [檢查可以直接使用的任何可用方法]
您能否提供教程/示例[也可以鏈接]來顯示此類操作的API使用情況?
是否有一種方法可以在Java應用程序(不使用工具)中使用JMSMessageId從IBM MQ隊列中刪除JMS消息?這些操作也是特定於供應商的嗎?使用JMSMessageID從MQ隊列中刪除JMS消息
通過API來查看用於刪除消息的接收操作,但是爲了刪除特定的消息,我們是否需要使用MessageSelector進行過濾並進行適當的刪除,還是有更簡單的方法? [檢查可以直接使用的任何可用方法]
您能否提供教程/示例[也可以鏈接]來顯示此類操作的API使用情況?
當您使用JMSMessageID
作爲選擇器中唯一的消息屬性時,WMQ會將查找優化爲與本地WMQ API相同,即MQMD.MessageID
,它是隊列中的索引字段。有關更多詳細信息,請參閱JMS Message Selection主題。
QueueReceiver rcvr = sess.createReceiver(inputQ, "JMSCorrelationID = '"+msgId+"'")
您還可以使用本地WMQ API調用使用Java本機代碼來做同樣的事情。您將執行正常的GET
操作,但在MQMD
結構中指定消息ID。
myMsg.messageId = someMsgID;
MQGetMessageOptions gmo = new MQGetMessageOptions();
myQueue.get(myMsg, gmo);
如何使用messageid刪除特定的消息表單隊列?
我也喜歡你的問題,我提供resuable功能。你只需要通過MessageId
和Queue
這個名字。對我來說沒問題。
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
。
感謝羅布。編輯的問題。我的意思是說它很簡單(在propgrammer看來)。 – gsndev 2012-08-09 18:40:03
我從來沒有見過一個簡單的程序員。 ;-) – 2012-08-09 19:24:21
:)又犯錯了!簡單代碼 - 可讀,至點,重用可用實用程序/ API。 – gsndev 2012-08-09 19:27:30