2016-10-05 15 views
1

トピックのサブスクリプションを聞いている2つのクライアントがあります。私は次の問題を見ている。メッセージの受信1クライアントが受信した後、クライアントとメッセージ削除のために複数回

問題1:1つのクライアントがメッセージを受信し、それらをマークし

場合は、他のクライアントがメッセージことを受け取ることができません完了します。

しかし、私はそのメッセージを受信して​​、クライアントがメッセージを受信すると、それは再び受け取るべきではないというように、それを確認するために、すべての私のクライアントが欲しい

問題2:

私はメッセージを承認していない場合完了しました。いくつかの回私はメッセージを複数回受け取っています。

問題3:

メッセージ受信中は、ネットワーク切断を参照してください。しばらくしてから再接続すると、メッセージの受信が再開されます。 ============

if (!namespaceManager.TopicExists("DataCollectionTopic")) 
        namespaceManager.CreateTopic("DataCollectionTopic"); 
      if (!namespaceManager.SubscriptionExists("DataCollectionTopic", "one")) 
       namespaceManager.CreateSubscription("DataCollectionTopic", "one"); 
      for(int i=0;i<100;i++) 
      { 
      BrokeredMessage bm = new BrokeredMessage("new Topic one"); 
      bm.Label = "hELLLOOOO xcvxvxcvxvxvxc DummyMEssage"+i; 
      bm.Properties["StoreName"] = "asdasdasqwedas"; 
      bm.Properties["MachineID"] = "Bajjiiiqweq567567wii"; 

      if (namespaceManager == null) 
      { 
       Console.WriteLine("\nUnexpected Error"); 
       return; 
      } 
      MessageSender sender = messageFactory.CreateMessageSender("DataCollectionTopic"); 
      sender.Send(bm); 

for receiving the message 

=================== 


MessageReceiver receiver = await messageFactory.CreateMessageReceiverAsync("DataCollectionTopic/subscriptions/Vijay"); 

       while (true) { 

       BrokeredMessage receivedMessage = receiver.Receive(); 

       try 
       { 
        ProcessMessage(receivedMessage); 
       // receivedMessage.Complete(); 
       } 

       catch (Exception e) 
       { 
        // receivedMessage.Abandon(); 
       } 
       } 
      } 

=============== 

TIA

+0

問題2。最後に「完了」とマークしないと、最終的にタイムアウトが発生します。これにより、もう一度ピックアップすることができます。 – granadaCoder

+0

私はいつでも言及していません。私はクライアントがn人いるので、彼らが立ち上がるとすぐにいつでもアップすることができるので、それらのメッセージを受け取る必要があります。問題は、クライアントを再起動しても、すでに受信したメッセージを再度受信している場合です。時々私は複数のメッセージを受信して​​います – user1844634

+0

"タイムアウト"機能が組み込まれています。私はデフォルトが30秒だと思う。まあ、それは依存しています。 「ロックの継続時間」はこちらhttps://azure.microsoft.com/en-us/documentation/articles/service-bus-azure-and-service-bus-queues-compared-contrasted/ – granadaCoder

答えて

0

問題1

両方のクライアントが

を使用した場合は、メッセージコードを送信するため

同じサブスクリプション名であれば、競合するコンシューマとして動作します。最初の消費者がメッセージを受け取り、完了(処理済み)とマークすると、勝者になります。残りのクライアントは同じメッセージを処理しません。 すべてのクライアントによってメッセージ(イベント)を受信する予定の場合は、各クライアントに独自のサブスクリプションが必要であり、メッセージのコピーが各サブスクリプションに配信されます。予想される動作である

発行2

。メッセージはMaxDeliverCountまで受信され、そのメッセージがDLQされます。これは、PeekLockモードのデフォルト動作です。 ReceiveAndDeleteではこれは起こりませんが、正常に処理されなかった場合にメッセージを失うので、危険なモードです。予想される動作である

発行3

PeekLockモードで受信した各メッセージは、LockDurationです。メッセージを完了したり放棄したりする処理コードに与えられる時間です。完了していない場合、メッセージは他の競合する消費者に見えるようになり、DeliveryCount回まで再処理されます。

  1. それをまとめると

    が正常に処理を行えば、同じメッセージ(イベント)

  2. 完全なメッセージを受信するすべてのクライアントのためのクライアントごとに複数のサブスクリプションを持っています。時間延長が必要な場合は、renew the lock
関連する問題