2017-03-15 14 views
0

私はメッセージをより速く処理できるように、Windowsサービスから複数のスレッド(タスク)を加入者と同じキューに接続しようとしています。私のキューに接続すると、最初に購読したスレッドでメッセージを受信し、残りはアイドル状態です。私は、メッセージをサブスクライブして受信するために使用していたコードを以下に示します。websphere MQの同じキューに複数のサブスクライバを割り当てることはできますか?

private MQQueueManager _queueManager; 
private MQQueue _queue; 
private MQTopic _topic; 
public bool isSubscribed = false; 

public void Subscribe() 
{ 
    var queueManagerName = "myQueueManager"; 
    var properties = new Hashtable(); 
    //Set all the properties here 
    _queueManager = new MQQueueManager(queueManagerName, properties); 

    //Conect to Queue 
    _queue = _queueManager.AccessQueue("devQueue", MQC.MQOO_INPUT_AS_Q_DEF); 

    isSubscribed = true; 
    while (isSubscribed) 
    { 
     if (cancellationToken.IsCancellationRequested) 
     { 
      isSubscribed = false; 
      cancellationToken.ThrowIfCancellationRequested(); 
     } 
     try 
     { 
      Receive(onMessageReceived); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Exception: {0}", ex); 
     } 
    } 
} 


public override void Receive<T>(Action<T> onMessageReceived) 
{ 
    try 
    { 
     var dataReceived = new MQMessage(); 
     _queue.Get(dataReceived); 

     T message; 
     message = (T)(object)dataReceived; 

     onMessageReceived(message);  
     _queueManager.Commit(); 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
} 

また、私はどちらか動作しませんでしたキューにアクセスするためのMQC.MQOO_INPUT_SHAREDを使用してみました。何か不足していますか?

+0

実行しているMQのバージョン(dspmqver出力)を教えてください。 – JasonE

+0

@JasonEバージョン8.0 – PushCode

答えて

1

引用符で囲まれたコードは、「devQueue」という名前のキューからメッセージを開いて受信しようとします。そのコードが複数のスレッドで実行されている場合、各スレッドに送信されるメッセージは、メッセージが処理される速度と、接続するMQのバージョンによって異なります。

しかし、あなたはあなたの質問に加入者について言及しています(あなたが引用したコードは、トピックとキューを宣言しています)。あなたは、アプリケーションの他の場所でトピックへのサブスクリプションを作成し、このサブスクリプションに送信されたメッセージを受け取るためにこのコードを使用していますか?もしそうなら、あなたの「キュー受信」スレッドは、単にサブスクリプションメッセージを保持しているキューとは異なるキューを開いている可能性があります。最初のサブスクリプションはどのように作成されますか?

+0

トピックに登録しています。私はキューに直接加入しており、MQバージョン8.0を使用しています。私は引用されたSubscribe()メソッドを含む私のクラスのための独自のインスタンスを持つ3つの個別のタスク( 'Task.Factory.StartNew')を作成しています。 – PushCode

+0

MQの通常の管理サブスクリプションは、アクティブなサブスクライバにディスパッチされる前に、公開されたメッセージを保持するためにシステムキューを使用します。このキューは、サブスクリプションが作成されたトピックとは異なる名前になります。 – Luke

+0

サブスクリプション時にMQDestinationとして "devQueue"という名前のMQQueueを使用してアンマネージ・サブスクリプションを作成したとすると、そのMQQueueを使用してメッセージを受け取ることができるはずです。購読するときにMQC.MQSO_MANAGEDオプションを使用しますか?その場合は、オプションを削除してみてください。デフォルトでは、待機中のコンシューマにメッセージを送信するときに、MQはLIFOの順序付けを使用します。これはパフォーマンス上の理由から、受信メッセージをすべて処理できず、次のコンシューマに「流出」するまで、ある消費者を支持することを意味します。これは、1つのスレッドだけがメッセージを取得している理由です。 – Luke

関連する問題