2009-09-01 12 views
2

私は、単純なJMSアプリケーションを、アプリケーション内のAIXサーバー上のOC4Jにデプロイしました。いくつかのキューをリッスンし、AS400サーバー上にデプロイされたWebsphere MQ 。JMSを使用するWebsphere MQ、MQで閉じた接続を閉じた

それは誤り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... 
} 
+0

しかし、何が問題なのですか?そして、それはどこに止まっていますか? - session.close()? – nos

+0

問題は、Websphere MQ側で古いリスナー/プロデューサがスタックされているため、余分なジョブがMQに接続されているように見えます。 リカバリコードは問題なく実行されます –

答えて

1

孤立した接続(MQ側のスタック接続は)(すなわち、それらはメッセージを消費しません)メッセージの処理に影響を与えませんので、それがあるように、我々は物事を残しましたMQで許可されている最大接続に達するまで待ちます。

リカバリはもはや機能しませんでした。その時点で、MQ管理者は孤立した接続を手動で削除する必要がありましたが、この特定の問題を検索すると、IBMサポートサイト:

check here

+0

参照されたAPARは、WMVが孤児をより早く救うようにチャネルをチューニングする方法を指示します。これは参考になりますが、これは回避策にすぎず、根本原因を修正し、リンクされた例外を出力することに代わるものではありません。 –

3

MQJMS1016は内部エラーであり、接続損失がコードまたはWMQ自体に異常が原因であることを示しています。チャンネルをチューニングすることは役立ちますが、アプリが利用可能なすべてのチャンネルを使い切るのに十分な速さで孤立した接続を吐き出している理由の問題に本当に遭遇する必要があります。

まず、実行したいWMQとWMQクライアントのバージョンを確認します。これが新しい開発の場合は、2011年9月時点でv6が廃止されているため、WMQ v7クライアントを使用していることを確認してください。v7クライアントはアップグレードするまでv6 QMgrsで動作します。 v7クライアントとQMgrに接続すると、かなりの数のチャンネル調整と再接続オプションが利用できます。

WMQ V7クライアントのダウンロードはこちら:http://bit.ly/bXM0q3また

は、コード内の再接続ロジックは、上記の試行間で寝ていないことに注意してください。クライアントが高い速度で接続要求をスローすると、WMQリスナーに過負荷がかかり、非常に効果的なDOS攻撃を実行する可能性があります。試行の間に数秒間寝ることをお勧めします。

最後に、リンクされた例外をJMSException catchブロックに出力してください。 JMSトランスポート・プロバイダに問題がある場合、JMSリンク例外には低レベルのエラー情報が含まれます。 WMQの場合、2035 MQRC_AUTHORIZATION_ERRORや2033 MQRC_NO_MSG_AVAILABLEなどの理由コードが含まれています。ここでは例です:あなたは、いくつかの夜午前2時にエラーが発生した場合

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."); 
    } 
} 

、あなたのWMQ管理者は、リンクされた例外のためにあなたに感謝します。

+0

ネットワークはアイドル状態の接続を終了するように設定されているため、問題は明らかで、リンクされた例外は無関係でした(ただし、問題の履歴を確認して、時間があればリンク例外を提供します)。 実際に接続回復に30秒のタイムアウトがあり、最大接続数に達するまでに数日かかることがありました(私の元の投稿が示唆するほど頻繁ではありません) 最終的に、キープアライブメッセージ我々が開始するあらゆるつながりを通じて。 –

+0

それは素晴らしいニュースです!それが価値あるものであれば、リンクされた例外はWMQに固有のものではありません。どんな運送業者にも関連する情報を入れるオプションがあります。したがって、それがコーディング標準になると、どのJMSコードにも役立ちます。私はそれがなければ生産にコードを受け入れない多くのクライアントを持っています。いずれにしても、キープアライブを聞いてうれしいことは今接続を維持していることです。 –

関連する問題