我正在尝试将一些消息批量发送到服务总线队列。我是使用SendBatch
的QueueClient
方法完成的。
我在此操作中得到FaultException
:
使用不同的SessionId,PartitionKey或。批处理代理消息 具有分区和的实体不支持MessageId 启用重复检测。
异常消息是不言自明的,我会尝试修复它,但有时它会起作用,不会抛出任何异常。
所以有时会引发异常,有时会起作用。我不会更改任何队列设置,也不会更改代码。
为什么会发生这种想法?
答案 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);
}
}