私は現在のトランザクション(メッセージ)で満たされているリモート・キューから読んでいます。私は、キューにアクセスすると、レコードの大きさを測定することによって、それを読んでいます。
getOptions.options = MQC.MQGMO_CONVERT + MQC.MQGMO_WAIT;
queue.getCurrentDepth();
キューのサイズが0よりも大きい場合にのみ、私はメッセージを取得するために進んでください。
MQJE001:完了コード「2」、理性「2033」私の問題は、いくつかのメッセージのために、私は次のエラーを取得するということです。
しかし、唯一のいくつかのメッセージのために、面白いことに、私は、カスタムの再試行変数を持っており、第三のリトライが空白のメッセージを取得することです。
マイ可能な解決策:
最初に私はそれがwaitInterval可能性があり、私は30秒に150ミリからそれを変えてきたと思いました。いくつかのメッセージのために私は100ミリ秒未満で正しくそれらを得ます。しかし、私に問題を与えるメッセージはすべてwaitIntervalを取るし、エラーを与え、3回目のリトライに空白のメッセージが表示されます。
第二の試験は、私がもともと持っているMQMessageクラスのパラメータを確認することでした。
- messageType:8
- エンコーディング:273
- フォーマット:
- キャラクタセット:0
私が正しくメッセージを取得すると、次のパラメータが残っています:
- messageType:8
- エンコーディング:273
- 形式:MQSTR
- キャラクタセット:819
私は3回目のリトライでエラー2033が発生したメッセージを持っているとき、私は空白のメッセージを取得し、パラメータは次のように変更します。
- messageType:8
- エンコーディング:273
- フォーマット:
- キャラクタセット:819
私は、キュー内のメッセージが正しい形式を示していなかったことを考えるようになりました。だから私はサポートに連絡し、彼らはすべてのメッセージが正しく変換ヘッダを持っていることを確認しました。
この問題は、誰かが何か似て直面している場合は、あなたのコメントをいただければ幸いです理由として疑問にまだ午前私はそう。ありがとうございました。
あなたは、データベースとしてIBM MQを扱っているし、それはあなたの悲しみのすべての種類の原因となります。
これは、あなたがメッセージを取得する方法です。
MQGetMessageOptions gmo = new MQGetMessageOptions();
gmo.options = CMQC.MQGMO_WAIT + CMQC.MQGMO_FAIL_IF_QUIESCING;
gmo.waitInterval = 5000; // wait up to 5 seconds
MQMessage receiveMsg = null;
boolean getMore = true;
while(getMore)
{
receiveMsg = new MQMessage();
try
{
// get the message on the queue
queue.get(receiveMsg, gmo);
/*
* Now go do something with the message
*/
}
catch (MQException e)
{
if ( (e.completionCode == CMQC.MQCC_FAILED) &&
(e.reasonCode == CMQC.MQRC_NO_MSG_AVAILABLE) )
{
// No message - loop again
}
else
{
System.out.println("MQException: " + e.getLocalizedMessage());
System.out.println("CC=" + e.completionCode + " : RC=" + e.reasonCode);
getMore = false;
}
}
catch (IOException e)
{
System.out.println("IOException:" +e.getLocalizedMessage());
}
}