在不同的Azure服务总线队列中使用相同的消息ID会导致错误

时间:2018-07-09 20:43:08

标签: c# azure async-await azureservicebus azure-servicebus-queues

我的以下功能有问题,该功能将计划的消息添加到Azure服务总线队列。调用方法时,创建方法便会弹出

var sendCodeSequence = await queueClient.ScheduleMessageAsync(message, 
                                                              new DateTimeOffset(endTime));

即使消息已添加到队列中,也不会在我的控制器中引发异常!

我的问题?

  1. 如果我在同一服务总线上的不同队列中多次使用相同的消息ID,即使它们都具有不同的序列ID,我也会在创建和删除每个队列时遇到麻烦吗? p>

  2. 我在代理消息构造器和消息ID属性中使用消息ID,这样可以吗,还是会导致添加更多并将其从队列中删除的问题?

例如我在同一服务总线名称空间上有5个不同的队列。并且可能会添加5条不同的消息,每个队列一个,所有消息都具有相同的代理消息ID。所以,不知道这是否会引起任何问题?

这是我使用事件ID作为消息ID将预定消息添加到队列的一种方法

public async Task <long> CreateHostPointCodeMessage(int eventId, YogaSpaceDuration duration, DateTime utcEventDateTime) {
  string serviceBusConnectionString = System.Configuration.ConfigurationManager.AppSettings["ServiceBusConnectionString"];
  string queueName = System.Configuration.ConfigurationManager.AppSettings["PreEventPointsCodeQueueName"];

  var queueClient = QueueClient.CreateFromConnectionString(serviceBusConnectionString, queueName);
  int length = Convert.ToInt16(EnumHelper.GetDisplayName(duration).Split(' ')[0]);
  var endTime = DateTime.SpecifyKind(utcEventDateTime.AddMinutes(length).AddMinutes(-5), DateTimeKind.Utc);

  BrokeredMessage message = new BrokeredMessage(eventId.ToString());
  message.MessageId = eventId.ToString();
  message.ScheduledEnqueueTimeUtc = endTime;

  var sendCodeSequence = await queueClient.ScheduleMessageAsync(message, new DateTimeOffset(endTime));
  await queueClient.CloseAsync();

  return sendCodeSequence;
}

仅供参考-我正在使用“ Microsoft.ServiceBus.Messaging”将消息发送到队列,但是根据此MS article,我应该使用“ Microsoft.Azure.ServiceBus”,我不知道这是否有什么不同吗?

1 个答案:

答案 0 :(得分:2)

将具有相同ID的消息发送到命名空间下的不同队列没有任何问题。

即使您可以将任意数量的具有相同ID的消息发送到同一队列,除非队列的RequiresDuplicateDetection属性设置为“ True”。

仅对于启用了“ RequiresDuplicateDetection”属性的队列,具有重复ID的消息将丢失。