【问题标题】:FaultException during sending messages to ServiceBus queue in a batch批量向ServiceBus队列发送消息时出现FaultException
【发布时间】:2017-12-04 17:31:45
【问题描述】:

我正在尝试将几条消息批量发送到服务总线队列。我正在使用QueueClientSendBatch 方法来做到这一点。

在此操作期间我收到了FaultException

使用不同的 SessionId、PartitionKey 或 具有分区的实体不支持 MessageId,并且 已启用重复检测。

异常的消息是不言自明的,我会尝试修复它,但有时它会起作用,不会引发异常。

所以有时它会抛出异常,有时它会起作用。我不更改队列的任何设置,也不更改代码。

任何想法为什么会发生?

【问题讨论】:

  • 难不成当它成功时,实际上整批都属于同一个会话?
  • 你可以确认当它工作时,它是实体/消息的相同状态?您是否在传入消息的上下文中发送(“send-via”)?
  • @Mikhail 我们没有显式使用 session,因为我们缓存和重用 QueueClient 可以隐式使用吗?
  • @SeanFeldman 不确定您所说的相同状态是什么意思,但我们发送的消息仅在特定于域的值上有所不同,我们不会为 messageidpartitionkey 或 @987654328 分配任何值@。而且,不,我们不是在传入消息的上下文中发送。
  • @AlexSikilinda 好的...但是您的队列是否已分区并且是否启用了重复检测?

标签: c# .net azureservicebus servicebus azure-servicebus-queues


【解决方案1】:

我遇到了同样的问题,并得到了这篇文章的帮助: https://github.com/Azure/azure-service-bus/issues/103

我意识到异常消息实际上是不正确的。它给人的印象是“distinct … MessageId is not supported with … duplicate detection enabled”实际上是必需的!

所以在我创建消息之后: var message = new Message(Encoding.UTF8.GetBytes(<..jsonstring...>));

我添加了这行代码并且成功了:

message.MessageId = Guid.NewGuid().ToString();

【讨论】:

    【解决方案2】:

    这可能是因为您的批处理包含将进入不同分区的消息。一个批次必须只包含一个分区的消息。就我而言,我的分区是 SessionId,所以我首先按 SessionId 对消息进行分组,然后按这些组进行批处理,效果很好。

    var bySessionId = messages.GroupBy(s => s.SessionId);
    foreach (var sessionSet in bySessionId)
    {
        var msgBatch = sessionSet.Batch(20); //Using .Batch from MoreLinq
        foreach (var b in msgBatch)
        {
            var sbb = await sender.CreateMessageBatchAsync();
            b.ForEach(m => sbb.TryAddMessage(m));
    
            await sender.SendMessagesAsync(sbb);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-04-22
      • 2021-09-08
      • 1970-01-01
      • 2019-08-28
      • 2012-12-07
      • 2021-03-21
      • 2017-06-07
      • 1970-01-01
      • 2017-03-29
      相关资源
      最近更新 更多