2016-10-15 23 views
1

以下、MQから情報を取得してDBに格納するJava MQ GETルーチンを公開しました。
ただし、GETとCOMMIT間の接続が失われた場合に問題が発生します。
接続が失われた場合は、COMMITと解釈されます。その後、データは失われます。java具体的なMQ GET&COMMIT/BACKOUTを実装する方法

具体的なGET & COMMIT/BACKOUTモデルはどのように実装する必要がありますか? IBM MQ文書で

String hostName = "192.168.163.63"; 
int port = 1418; 
String userId = "mq"; 
String password = "mq"; 
String queueManagerName = "QueueManager1418"; 
String channelName = "ServerChannel"; 
String queueName = "TestQueue"; 

MQEnvironment.hostname = hostName; 
MQEnvironment.port = port; 
MQEnvironment.userID = userId; 
MQEnvironment.password = password; 
MQEnvironment.channel = channelName; 
try { 
    MQQueueManager qMgrIn1 = new MQQueueManager(queueManagerName); 
    int openOptionsIn1 = CMQC.MQOO_INPUT_SHARED | CMQC.MQOO_INQUIRE; 
    MQQueue queueIn1 = qMgrIn1.accessQueue(queueName, openOptionsIn1); 
    MQMessage getMessage1 = new MQMessage(); 
    MQGetMessageOptions mqGetMessageOptions1 = new MQGetMessageOptions(); 
    mqGetMessageOptions1.options = CMQC.MQGMO_SYNCPOINT; 
    queueIn1.get(getMessage1, mqGetMessageOptions1); 
    String txt1 = getMessage1.readLine(); 
    System.out.println("get1 << " + txt1); 

    //////////// make problem point like network disconnect with MQ server 
    DoSaveInfo2DB(); 
    qMgrIn1.commit(); 
    if (queueIn1 != null) 
     queueIn1.close(); 
    if (qMgrIn1 != null) 
     qMgrIn1.disconnect(); 
} catch (Exception ex) { 
    System.out.println("ex.getMessage() = " + ex.getMessage()); 
} 

コミットされていない要求がある一方で、プログラムがMQDISC呼び出しを発行した場合、私はRRSとのz/OSバッチを除いて怒鳴るテキスト

に気づいた、暗黙の同期点が発生します。プログラムが異常終了した場合、暗黙のバックアウトが発生します。 z/OSでは、最初にMQDISCを呼び出さずにプログラムが正常に終了すると、暗黙的な同期点が発生します。 MQに接続されたTCBが正常に終了すると、プログラムは正常終了したものとみなされます。 z/OS UNIXシステム・サービスおよび言語環境(LE)で実行する場合、異常終了または信号に対してデフォルトの条件処理が呼び出されます。 LE条件ハンドラはエラー状態を処理し、TCBは正常に終了します。 これらの条件下で、MQは作業ユニットをコミットします。

アプリケーションがMQサーバとの接続を失った場合は、コミット/バックアウト前にDB(ネットワーク上の問題)が発生した場合、MQは自動的にコミットして結果を失いました。

答えて

2

これは、アプリケーションが以前にコミット/バックアウトMQサーバー& DB(ネットワーク 問題)との接続を失った場合、MQは自動的にCOMMITを意味し、 結果に我々はそれを失った!!!!

z/OS UNIXシステム・サービスでプログラムを実行していますか?あなたがそうでないなら、それは当てはまりません。通常、z/OS(バッチ、CICSまたはIMS)またはLinux on System Zのアプリケーションを実行する企業はほとんどありません。

WindowsまたはLinuxまたはUnixで実行している場合は、 AIX、HP-UXまたはSolaris)、あなたは2文を以下が適用されます。コミットされていない の要求がある一方で、プログラムがMQDISC呼び出しを発行した場合

  • 、暗黙の同期点が発生します。

  • プログラムが異常終了した場合、暗黙のバックアウトが発生します。

意味がありますか?

最後に、単相UOW(単位作業)を実行していますが、おそらく2相UOWを実行しているはずです。

+0

アドバイスいただきありがとうございます。私はWindowsで自分のアプリケーションを実行しています。終了する可能性のあるアプリケーション(コミットと切断の前に)(異常終了)の位置をメモし、代わりにコミットされていないメッセージをコミットしてください。問題はここで私は自動的にバックアウトしたいです(WindowsではZOSではなく!!!)。私が正しく理解していれば、私のアプリは2 Phase UOWを実装するためのTrans Managementを持っていないので、何かアドバイスをいただければ幸いです。 –

+0

異常終了時のデフォルト動作は変更できません。あなたがgetをして接続が失われた場合、メッセージがキューに戻される(つまり、将来それを処理できるように)ことは良いことです。2段階のUOWが必要な場合は、Java/MQ Extended Transactional Client(XA)を使用します。 – Roger

関連する問題