4

MQSeries を使用してメッセージング システムを構築しています。何らかの理由で、q.get(...) を実行すると、例外がスローされます (具体的な MQException はわかりません)。以下は、エラーの原因となっているコードです。

private static MQGetMessageOptions GMO = new MQGetMessageOptions();
private static int GMO_OPTIONS = MQC.MQGMO_SYNCPOINT | MQC.MQGMO_WAIT;
GMO.options = GMO.options | GMO_OPTIONS;
GMO.waitInterval = MQC.MQWI_UNLIMITED;

MQEnvironment.hostname = args[0];
MQEnvironment.channel = args[2];
MQEnvironment.port = Integer.parseInt(args[1]);
MQQueueManager queueManager = new MQQueueManager(args[3])

MQMessage msg = new MQMessage();
MQQueue q = queueManager.accessQueue("qName1",MQC.MQOO_OUTPUT);
q.get(msg, GMO);

私の計画は、このエラーが発生した場合、メッセージをスキップして削除することです。削除を実行するには、次の関数を呼び出します。

private void deleteMsg(MQQueueManager queueManager, String queueName) throws MQException {
    MQGetMessageOptions tempGmo = new MQGetMessageOptions();
        tempGmo.options |= MQC.MQGMO_WAIT;
        tempGmo.waitInterval = 1000;
    MQQueue remover = queueManager.accessQueue(queueName, MQC.MQOO_INPUT_AS_Q_DEF);
        remover.get(new MQMessage(), tempGmo);
        queueManager.commit();
}

この特定のシナリオでは、deleteMsg 関数の remover.get() も同じ理由で失敗しますか? または、MQQueue(MQC.MQOO_INPUT_AS_Q_DEF 対 MQC.MQOO_OUTPUT) を構築するために使用されるオプションは、それが失敗するのを防ぎますか? キューのメッセージにアクセスできない場合、一番上のメッセージを破棄して次のメッセージに移動するにはどうすればよいですか?

質問を短くすると: 特定のキューで get() を実行してメッセージを取得できない場合、同じキューで破損したメッセージを削除するにはどうすればよいですか?

ありがとうございました!

4

3 に答える 3

0

あなたがしていることがうまくいかない理由はわかりませんが、なぜJMS APIを使用する代わりにMQシリーズの独自のAPIを使用しているのでしょうか。JMS の用語では、トップ メッセージの削除は単にメッセージを受信することを意味するため、 の呼び出しがsession.receieve()機能します。

共通の JMS API を使用すると、多くの利点があります。その主なものは、コードを 1 行も変更することなく、MQ シリーズから他のメッセージング ソリューションに簡単に移行できることです。

于 2013-05-30T16:52:01.847 に答える