2017-05-08 5 views
1

マイコード使用:キューを順次閲覧し、各メッセージを読み取るために予想されるようにC番号:IBM MQ「ロック解除」メッセージを読む()メソッド

 //Initialize MQMessage 
     MQMessage message = new MQMessage(); 

     //Initialize WebMQConnection 
     WebSphereMQConnection mqRequestConnection = new WebSphereMQConnection(initQMName, initQChannel, initQConnection, initQName, string.Empty, string.Empty); 
     mqRequestConnection.Open(); 
     mqRequestConnection.Read(message); 


     //Get the contents as a string 
     string body = message.ReadString(message.MessageLength); 
     return body; 

このコードは、コンソールアプリケーションと作品の一部です。フラットファイルから文字列の内容を解析します。

しかし、Read()メソッドはプログラムが終了するまでメッセージをロックしているようです。プログラムをループで実行してすべてのメッセージを順番に読み込んでも、プログラムが完全に閉じられるまではメッセージを「解放」していないようです。

私は、取得、PUT、廃棄、バックアウトなどを試みましたが、コンソールアプリケーション全体の実行を停止する以外に何も動作していないようです。

+0

'WebSphereMQConnection'は、IBMが提供する何かのようには見えません。これは何をしているのですか?同期点の下でキューを開くのですか?その場合は、MQをコミットしてメッセージを「解放」する必要があります。 – JoshMc

+0

@ JoshMcこれは、Syncpoint操作を処理するOpen()を呼び出すと、最終的にキューマネージャを作成するクラスのコンストラクタです。私があまり支配していないレガシーコードです。私はコミットを追加しようとしましたが、何もしないようです。私は問題が私が与えられたコアコードであるかもしれないと考え始めている。 – Reed

+0

おそらく、コミットを実行するメソッドがありますか? – JoshMc

答えて

0
//Initialize WebMQConnection 
WebSphereMQConnection mqRequestConnection = new WebSphereMQConnection(initQMName, initQChannel, initQConnection, initQName, string.Empty, string.Empty); 
mqRequestConnection.Open(); 
mqRequestConnection.Read(message); 

これは何ですか?確かにIBM MQのクラスとメソッドではありません。それで、自家製のクラスです。

したがって、Read()メソッドは実際に「ブラウズ」を実行します。不適切な名前のメソッド。私はあなたのRead()メソッドで、MQGETでMQGMO_LOCKオプションを使用していると思います。

WebSphereMQConnectionクラスを削除して、純粋なIBM MQ .NETコードを書かないのはなぜですか?ここで

は、任意のメッセージをロックせずにキューを閲覧するMQ CS .NETのサンプルプログラムです:

using System; 
using IBM.WMQ; 

/// <summary> Program Name 
/// MQTest62B 
/// 
/// Description 
/// This C# class will connect to a remote queue manager 
/// and get (browse) a message from a queue using a managed .NET environment. 
/// 
/// Sample Command Line Parameters 
/// -h 127.0.0.1 -p 1415 -c TEST.CHL -m MQWT1 -q TEST.Q1 
/// </summary> 
/// <author> Roger Lacroix, Capitalware Inc. 
/// </author> 
namespace MQTest62 
{ 
    public class MQTest62B 
    { 
     private System.Collections.Hashtable inParms = null; 
     private System.String qManager; 
     private System.String outputQName; 
     private System.String userID = "tester"; 
     private System.String password = "barney"; 

     /* 
     * The constructor 
     */ 
     public MQTest62B() 
      : base() 
     { 
     } 

     /// <summary> Make sure the required parameters are present.</summary> 
     /// <returns> true/false 
     /// </returns> 
     private bool allParamsPresent() 
     { 
      bool b = inParms.ContainsKey("-h") && inParms.ContainsKey("-p") && 
        inParms.ContainsKey("-c") && inParms.ContainsKey("-m") && 
        inParms.ContainsKey("-q"); 
      if (b) 
      { 
       try 
       { 
        System.Int32.Parse((System.String)inParms["-p"]); 
       } 
       catch (System.FormatException e) 
       { 
        b = false; 
       } 
      } 

      return b; 
     } 

     /// <summary> Extract the command-line parameters and initialize the MQ variables.</summary> 
     /// <param name="args"> 
     /// </param> 
     /// <throws> IllegalArgumentException </throws> 
     private void init(System.String[] args) 
     { 
      inParms = System.Collections.Hashtable.Synchronized(new System.Collections.Hashtable(14)); 
      if (args.Length > 0 && (args.Length % 2) == 0) 
      { 
       for (int i = 0; i < args.Length; i += 2) 
       { 
        inParms[args[i]] = args[i + 1]; 
       } 
      } 
      else 
      { 
       throw new System.ArgumentException(); 
      } 

      if (allParamsPresent()) 
      { 
       qManager = ((System.String)inParms["-m"]); 
       outputQName = ((System.String)inParms["-q"]); 
       // Set up MQ environment 
       MQEnvironment.Hostname = ((System.String)inParms["-h"]); 
       MQEnvironment.Channel = ((System.String)inParms["-c"]); 
       try 
       { 
        MQEnvironment.Port = System.Int32.Parse((System.String)inParms["-p"]); 
       } 
       catch (System.FormatException e) 
       { 
        MQEnvironment.Port = 1414; 
       } 

       if (userID != null) 
        MQEnvironment.UserId = userID; 

       if (password != null) 
        MQEnvironment.Password = password; 
      } 
      else 
      { 
       throw new System.ArgumentException(); 
      } 
     } 

     /// <summary> Connect, open queue, read (browse) a message, close queue and disconnect. </summary> 
     /// 
     private void testReceive() 
     { 
      MQQueueManager qMgr = null; 
      MQQueue inQ = null; 
      int openOptions = MQC.MQOO_BROWSE + MQC.MQOO_FAIL_IF_QUIESCING; 

      try 
      { 
       qMgr = new MQQueueManager(qManager); 
       System.Console.Out.WriteLine("MQTest62B successfully connected to " + qManager); 

       inQ = qMgr.AccessQueue(outputQName, openOptions, null, null, null); // no alternate user id 
       System.Console.Out.WriteLine("MQTest62B successfully opened " + outputQName); 

       testLoop(inQ); 

      } 
      catch (MQException mqex) 
      { 
       System.Console.Out.WriteLine("MQTest62B cc=" + mqex.CompletionCode + " : rc=" + mqex.ReasonCode); 
      } 
      catch (System.IO.IOException ioex) 
      { 
       System.Console.Out.WriteLine("MQTest62B ioex=" + ioex); 
      } 
      finally 
      { 
       try 
       { 
        if (inQ != null) 
         inQ.Close(); 
        System.Console.Out.WriteLine("MQTest62B closed: " + outputQName); 
       } 
       catch (MQException mqex) 
       { 
        System.Console.Out.WriteLine("MQTest62B cc=" + mqex.CompletionCode + " : rc=" + mqex.ReasonCode); 
       } 

       try 
       { 
        if (qMgr != null) 
         qMgr.Disconnect(); 
        System.Console.Out.WriteLine("MQTest62B disconnected from " + qManager); 
       } 
       catch (MQException mqex) 
       { 
        System.Console.Out.WriteLine("MQTest62B cc=" + mqex.CompletionCode + " : rc=" + mqex.ReasonCode); 
       } 
      } 
     } 

     private void testLoop(MQQueue inQ) 
     { 
      bool flag = true; 
      MQMessage msg = new MQMessage(); 
      MQGetMessageOptions gmo = new MQGetMessageOptions(); 
      gmo.Options |= MQC.MQGMO_BROWSE_NEXT | MQC.MQGMO_WAIT | MQC.MQGMO_FAIL_IF_QUIESCING; 
      gmo.WaitInterval = 500; // 1/2 second wait time or MQC.MQEI_UNLIMITED 

      while (flag) 
      { 
       try 
       { 
        msg = new MQMessage(); 
        inQ.Get(msg, gmo); 
        System.Console.Out.WriteLine("Message Data: " + msg.ReadString(msg.MessageLength)); 
       } 
       catch (MQException mqex) 
       { 
        System.Console.Out.WriteLine("MQTest62B CC=" + mqex.CompletionCode + " : RC=" + mqex.ReasonCode); 
        if (mqex.Reason == MQC.MQRC_NO_MSG_AVAILABLE) 
        { 
         // no meesage - life is good - loop again 
        } 
        else 
        { 
         flag = false; // severe error - time to exit 
        } 
       } 
       catch (System.IO.IOException ioex) 
       { 
        System.Console.Out.WriteLine("MQTest62B ioex=" + ioex); 
       } 
      } 
     } 

     /// <summary> main line</summary> 
     /// <param name="args"> 
     /// </param> 
     //  [STAThread] 
     public static void Main(System.String[] args) 
     { 
      MQTest62B write = new MQTest62B(); 

      try 
      { 
       write.init(args); 
       write.testReceive(); 
      } 
      catch (System.ArgumentException e) 
      { 
       System.Console.Out.WriteLine("Usage: MQTest62B -h host -p port -c channel -m QueueManagerName -q QueueName"); 
       System.Environment.Exit(1); 
      } 
      catch (MQException e) 
      { 
       System.Console.Out.WriteLine(e); 
       System.Environment.Exit(1); 
      } 

      System.Environment.Exit(0); 
     } 
    } 
} 
関連する問題