我试图想出为 Azure 服务总线队列或主题安排消息的最佳方法,同时保持选项打开以立即发送消息而不是预定消息。如果我尝试在第一条消息的预定时间或之后发送替换消息,我想确保我可以保护自己免受创建重复消息的影响。
如果您打开重复检测并且两条消息具有相同的 MessageId,那么在第一条消息的预定入队时间之前发送第二条消息是否会有效地取消预定消息?此外,如果计划的消息首先成功排队,那么假设第二条消息将被忽略是否安全?
我试图想出为 Azure 服务总线队列或主题安排消息的最佳方法,同时保持选项打开以立即发送消息而不是预定消息。如果我尝试在第一条消息的预定时间或之后发送替换消息,我想确保我可以保护自己免受创建重复消息的影响。
如果您打开重复检测并且两条消息具有相同的 MessageId,那么在第一条消息的预定入队时间之前发送第二条消息是否会有效地取消预定消息?此外,如果计划的消息首先成功排队,那么假设第二条消息将被忽略是否安全?
如果您打开重复检测并且两条消息具有相同的 MessageId,那么在第一条消息的预定入队时间之前发送第二条消息是否会有效地取消预定消息?
我用下面的示例代码做了一个测试,发现第二条消息会被忽略。
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();