1

スケジュールされたメッセージの代わりにメッセージをすぐに送信するオプションを開いたままにして、Azure Service Bus キューまたはトピックのメッセージをスケジュールする最良の方法を考え出そうとしています。最初のメッセージの予定時刻以降に代わりのメッセージを送信しようとした場合に、重複したメッセージを作成しないように自分自身を保護できるようにしたいと考えています。

重複検出をオンにし、両方のメッセージの MessageId が同じ場合、最初のメッセージのスケジュールされたエンキュー時間の前に 2 番目のメッセージを送信すると、スケジュールされたメッセージは効果的にキャンセルされますか? また、スケジュールされたメッセージが最初に正常にキューに入れられた場合、2 番目のメッセージは無視されると想定しても安全ですか?

4

1 に答える 1

3

重複検出をオンにし、両方のメッセージの MessageId が同じ場合、最初のメッセージのスケジュールされたエンキュー時間の前に 2 番目のメッセージを送信すると、スケジュールされたメッセージは効果的にキャンセルされますか?

次のサンプル コードでテストを行ったところ、2 番目のメッセージが無視されることがわかりました。

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

for (int i = 0; i < 2; i++)
{
    if (i == 0)
    {
        client.SendAsync(new BrokeredMessage("testmes1") { MessageId = "test1", ScheduledEnqueueTimeUtc = DateTime.UtcNow.AddSeconds(60) }).Wait();
    }
    else
    {
        client.SendAsync(new BrokeredMessage("testmes2") { MessageId = "test1" }).Wait();
    }

} 

キューからメッセージを受け取ります:

client.OnMessage(message =>
{
    Console.WriteLine(String.Format("Message body: {0}", message.GetBody<String>()));
    Console.WriteLine(String.Format("Message id: {0}", message.MessageId));
});

出力:

ここに画像の説明を入力

スケジュールされたメッセージをキャンセルしたい場合は、そのスケジュールされたメッセージがアクティブになる前にCancelScheduledMessageAsync() メソッドを呼び出すことができます。

client.CancelScheduledMessageAsync(sequenceNumber).Wait();
于 2017-07-31T07:17:02.567 に答える