JMSを使用して、WebSphere MQは、MQに引っかかって接続を閉じました
-
20-09-2019 - |
質問
私は自分のアプリケーションでは、私はいくつかのキューに聞いていると、AS400サーバの下で展開されたWebSphere MQ上の他のキューへの送信、AIXサーバーの下にOC4JにデプロイされたシンプルなJMSアプリケーションを持っています。
それがエラーMQJMS1016
でしばらくの間アイドル状態にとどまるの(これは問題ではありません)の、そしてそれが起こるとき、私が回復しようとすると、問題は、これらのキューへの私の接続が終了していること/閉じています接続とそれが動作するには、しかし、古い接続はMQでスタックしていると、それが手動で終了されるまで終了しないでしょう。
次のように回復コードは行きます:
public void recover() {
cleanup();
init();
}
public void cleanup(){
if (session != null) {
try {
session .close();
} catch (JMSException e) {
}
}
if (connection != null) {
try {
connection.close();
} catch (JMSException e) {
}
}
}
public void init(){
// typical initialization of the connection, session and queue...
}
解決 2
孤立した接続(MQ側のスタック接続)ので(つまり、彼らはメッセージを消費しません)メッセージの処理に影響を与えませんMQ上で許容される最大接続数に達するまでは、そのまま、私たちは物事を残しています。
回復はもう動作しませんでした、と私たちはその点に達したら、MQ管理者が手動で孤立した接続をクリーニングしなければならなかった、しかし、良いニュースは、この特定の問題を検索すると、IBMサポート・サイトで報告された問題につながったということです。
他のヒント
MQJMS1016は内部エラーであり、接続損失がコードまたはWMQ自体に異常が原因であることを示しています。チャンネルをチューニングすることは助けるが、あなたは本当にアプリが利用可能なすべてのチャンネルを排出するのに十分な速孤立した接続を吐き出すている理由の問題に取得する必要があります。
私がやりたいと思いますまず最初にWMQのと実行されているWMQクライアントのバージョンを確認しています。これは新しい開発をされた場合V6は、終末期の9月、2011年のようにあなたにもあることにアップグレードできるようになるまでV7クライアントがV6 QMgrsで動作があるので、あなたはWMQ v7のクライアントを使用していることを確認してください。あなたは、クライアントとQMGRをV7ために取得したら、あなたに利用可能なチャネルチューニングと再接続オプションのかなりがあります。
WMQ v7のクライアントのダウンロードはここにある: http://bit.ly/bXM0q3する
また、上記のコードに再接続ロジックが試行間スリープしないことに注意してください。クライアントが高速で接続要求をスローした場合、それはWMQリスナーをオーバーロードし、非常に効果的なDOS攻撃を実行することができます。試行間の数秒をスリープ状態に推奨ます。
最後に、あなたたJMSExceptionのcatchブロック内のリンクされた例外を印刷してくださいしてください。あなたがJMSトランスポート・プロバイダに問題がある場合は、JMSリンクされた例外は、任意の低レベルのエラー情報が含まれています。 WMQの場合には、2035 MQRC_AUTHORIZATION_ERROR又は2033 MQRC_NO_MSG_AVAILABLEなどの理由コードを含んでいます。ここでは例があります:
try {
.
. code that might throw a JMSException
.
} catch (JMSException je) {
System.err.println("caught "+je);
Exception e = je.getLinkedException();
if (e != null) {
System.err.println("linked exception: "+e);
} else {
System.err.println("No linked exception found.");
}
}
あなたには、いくつかの夜午前2時エラーが発生した場合、あなたのWMQ管理者は、リンクされた例外のためにあなたに感謝します。