4

一度呼び出しclient.Send(brokeredMessage);ますが、メッセージを数回受け取ります。ハンドルキューには、このコードを使用します

private static void HandleQueue(string queueName, MessageHandler messageHandler)
        {
            // Create the queue if it does not exist already
            string connectionString =
                Configuration.GetConnectionString("Microsoft.ServiceBus.ConnectionString",false);

            var namespaceManager =
                NamespaceManager.CreateFromConnectionString(connectionString);

            if (!namespaceManager.QueueExists(queueName))
            {
                namespaceManager.CreateQueue(queueName);
            }

            QueueClient client =
                QueueClient.CreateFromConnectionString(connectionString, queueName);

            while (true)
            {
                BrokeredMessage message = client.Receive();

                if (message != null)
                {
                    try
                    {    
                        messageHandler(message);

                        // Remove message from queue
                        message.Complete();
                    }
                    catch (Exception)
                    {
                        // Indicate a problem, unlock message in queue
                        message.Abandon();
                    }
                }
            }
        }

問題は、実行に時間がかかるBrokeredMessage message = client.Receive();場合に、複数回呼び出されて同じメッセージが返されることです。messageHandler(message);どうすれば修正できますか?

4

3 に答える 3

11

処理中にメッセージのロックが解除されています。メッセージのロック タイムアウトを設定する適切な場所は、QueueDescription http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.queuedescription.lockduration.aspxです。

ここで許可される最大時間は 5 分です。メッセージをさらに長く処理する必要がある場合は、RenewLockメッセージを呼び出して、他のコンシューマーから見えないようにすることができます。Completeプロセスがクラッシュした場合、メッセージが再び返されないため、処理が完了する前に電話をかけることはお勧めできません。

上記のプロパティはBrokeredMessage.ScheduledEnqueueTimeUtc、メッセージがキューからコンシューマーに表示されるときに「遅延」するために使用されます。1 日目にメッセージを送信し、スケジュールされた時間を 2 日目に設定すると、2 日Recieve目まで電話でメッセージが返されないとします。

于 2013-07-23T10:20:30.663 に答える
1

あなたがしなければならないことがいくつかあります:

  1. While(true) ループにスリープ時間を導入します。Thread.Sleep(30000); としましょう。
  2. メッセージの内容を取得し、メッセージを完了としてマークします。次に、メッセージ自体ではなく、取得したコンテンツをメッセージ ハンドラーに渡します。"messagehanfler" の完了を待つのは良い習慣ではありません。
  3. 処理中にメッセージ ハンドラー内でエラーが発生した場合は、同じ内容の別のブローカー メッセージをキューに入れます。
  4. 有害なメッセージを処理します。仲介されたすべてのメッセージの配信回数を確認し、配信回数が n 回 (たとえば 5 回) を超えた場合はメッセージを削除します。

それが役に立てば幸い!

于 2013-07-22T19:31:25.450 に答える
1

許可された時間内にメッセージが処理されなかった場合、メッセージがキューに戻るように聞こえます(メッセージハンドラーが長時間実行された場合にのみ発生するという説明によると)。

メッセージの可視性タイムアウトを増やして、メッセージがすぐに静かなキューに戻らないようにしたいようです。ServiceBus では、メッセージが完了していない場合にメッセージが再表示される時間を事前に計算することを意味します。

http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.brokeredmessage.scheduledenqueuetimeutc.aspx

于 2013-07-23T03:37:56.533 に答える