3

Java アプリケーションで JMSMessageId を使用して (ツールを使用せずに) IBM MQ キューから JMS メッセージを削除する方法はありますか? また、そのような操作はベンダー固有ですか?

メッセージを削除するために使用される受信操作についてAPIを調べましたが、特定のメッセージを削除するには、MessageSelectorを使用してフィルタリングして適切に削除する必要がありますか、それとももっと簡単な方法がありますか? [直接使用できる利用可能な方法を確認中]

そのような操作の API の使用法を示すチュートリアル/例 [リンクも可能] を提供していただけますか?

4

2 に答える 2

4

セレクターで唯一のメッセージ プロパティとして使用する場合、WMQ はルックアップを最適化して、キュー内のインデックス付きフィールドであるJMSMessageIDネイティブ WMQ API get と同じになるようにします。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 を使用して特定のメッセージ フォーム キューを削除するには?

私もあなたの問題のように、再利用可能な機能を提供します。パス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

于 2014-07-25T15:11:49.767 に答える