0

接続エラーが発生したときに自動的に接続するように要求しています (メッセージが失われないように、またはその相関 ID も失われないように)。

IBM 6.x リモート MQ サーバーに接続された IBM MQ 7x クライアントを介して、メッセージ/MQ Manager に自動的に再接続します (7x MQ サーバーをアップグレードするオプションはありません)。

やってみた

Manager が切断されている場合は、停止して再接続します

しかし、これは相関IDの値を失い続けます。

MQ.NET クラスを使用しています。また、接続障害が発生した場合に手動で再接続できるかどうかも教えてください。

4

2 に答える 2

2

MQ アプリケーションの再接続ロジックの作成は、かなり簡単です。コントローラー クラスとワーカー クラスで再接続ロジックを処理するのが好きです。Universal File Mover (UFM)、http://www.capitalware.biz/ufm_overview.html、特に MQReceive Action を参照してください。はい、UFM は Java で記述されていますが、Java/MQ コードと C#/MQ コードの間に違いはありません。UFM はオープン ソース プロジェクトで、ソース コードをダウンロードできます。

特に、MQReceiveAction.java および MQGetMsg.java クラスを見てください。MQReceiveAction.java はコントローラー クラスで、MQGetMsg.java はワーカー クラスです。MQReceiveAction は、MQGetMsg クラスを介してキュー マネージャーに接続します。MQException が発生すると、MQReceiveAction は MQGetMsg を介してキュー マネージャーから切断し、1 分間スリープしてから、キュー マネージャーへの再接続を試みます。

しかし、これは相関IDの値を失い続けます。

さて、捨てられていない/クリーンアップされていないクラスに保存していますか? この例では、CorrelID を一時的に保存する必要がある場合は、単純に MQReceiveAction にワーカー クラスから取得させ、MQReceiveAction が正常に再接続されたら、CorrelID を新しいワーカー クラスにプッシュします。

問題を 10,000 フィートから見て、ブロックしているコンポーネントを分離することをお勧めします。

于 2013-04-17T14:47:43.990 に答える
2

すべての MQ メソッド呼び出しを try/catch ブロックと catch ブロックに配置し、例外が接続エラーであるかどうかを判断してから、以前に開いていたすべての MQ オブジェクトを再接続して再度開くことをお勧めします。例えば:

    public static void GetQueueName()
    {
        Hashtable mqProps = new Hashtable();
        MQQueueManager qm = null;
        String strCorrelId = "00123456789";
        MQQueue importQ = null;

        Reconnect:
        try
        {
            mqProps.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED);
            mqProps.Add(MQC.CHANNEL_PROPERTY, "NET.CHL");
            mqProps.Add(MQC.HOST_NAME_PROPERTY, "localhost");
            mqProps.Add(MQC.PORT_PROPERTY, 2099);

            qm = new MQQueueManager("QM1", mqProps);
        }
        catch (MQException mqex)
        {
            // Handle any exception appropriately
        }

        try
        {
            importQ = qm.AccessQueue("Q1", MQC.MQOO_INPUT_SHARED | MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING);

            MQMessage mqPutMsg = new MQMessage();
            mqPutMsg.WriteString("This is an import message");
            mqPutMsg.CorrelationId = System.Text.Encoding.UTF8.GetBytes(strCorrelId);
            MQPutMessageOptions mqpmo = new MQPutMessageOptions();
            mqpmo.Options = MQC.MQPMO_NEW_CORREL_ID;
            importQ.Put(mqPutMsg,mqpmo);

            MQMessage respMsg = new MQMessage();
            MQGetMessageOptions gmo = new MQGetMessageOptions();
            gmo.WaitInterval = 3000;
            gmo.Options = MQC.MQGMO_WAIT;

                importQ.Get(respMsg, gmo);
            }
            catch (MQException ex)
            {
                switch(ex.ReasonCode)
                {
                    case MQC.MQRC_CONNECTION_BROKEN:
                    case MQC.MQRC_CONNECTION_ERROR:
                    case MQC.MQRC_CONNECTION_QUIESCING:
                        {
                            try
                            {
                                importQ.Close();
                                qm.Disconnect();
                            }
                            catch (Exception ex1)
                            {
                                // Ignore any exception
                            }
                            goto Reconnect;
                        }
                }
            }
            importQ.Close();                
            qm.Disconnect();
    }
于 2013-04-17T05:23:31.260 に答える