在批处理中向ServiceBus队列发送消息时发生FaultException

时间:2017-12-04 17:31:45

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

我正在尝试将一些消息批量发送到服务总线队列。我是使用SendBatchQueueClient方法完成的。

我在此操作中得到FaultException

  

使用不同的SessionId,PartitionKey或。批处理代理消息   具有分区和的实体不支持MessageId   启用重复检测。

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

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

为什么会发生这种想法?

2 个答案:

答案 0 :(得分:0)

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

我意识到异常消息实际上是不正确的。它给人的印象是实际上是必需的,“不支持distinct…MessageId…启用了重复检测”。

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

我添加了以下代码行,并且有效:

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

答案 1 :(得分:0)

这可能是因为您的批次包含将进入不同分区的消息。一个批次必须只包含一个分区的消息。就我而言,我的分区是 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);
    }
}