是否有一种方法可以在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