2017-07-29 5 views
1

私はAzureサービスバスキューまたはトピックのメッセージをスケジュールする最善の方法を考え出していますが、オプションを開いたままにしておくと、スケジュールされたメッセージの代わりにメッセージをすぐに送信できます。私は、最初のメッセージのスケジュールされた時刻に、またはそれ以降に、置換メッセージを送信しようとすると、重複メッセージを作成しないように自分自身を守ることができます。複製検出を使用して、スケジュールされたAzureサービスバスメッセージをキャンセルできますか?

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

答えて

2

重複検出を有効にして、両方のメッセージが同じ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)); 
}); 

出力:

enter image description here

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

+0

エビデンスに基づいて、重複検出では、過去にエンキューされたメッセージのみをチェックするのではなく、スケジュールされたメッセージが重複しているかどうかを確認することもできます。私は理論的な振る舞いが、スケジュールされたメッセージのシーケンス番号を後で取り消すことを避けることを避けることができたので、ちょっと残念です(代わりに、メッセージのビジネスコンテキストに固有のMessageIdを使用するつもりでした)。これを見ていただきありがとうございます。 –

関連する問題