C# 在批处理中将消息发送到ServiceBus队列期间发生FaultException
我正在尝试批量向服务总线队列发送几条消息。我是用一种方法来做这件事的 在此操作期间,我收到一个C# 在批处理中将消息发送到ServiceBus队列期间发生FaultException,c#,.net,azureservicebus,servicebus,azure-servicebus-queues,C#,.net,Azureservicebus,Servicebus,Azure Servicebus Queues,我正在尝试批量向服务总线队列发送几条消息。我是用一种方法来做这件事的 在此操作期间,我收到一个故障异常: 批处理具有不同SessionId、PartitionKey或 具有分区和分区的实体不支持MessageId 已启用重复检测 异常的消息是不言自明的,我会尝试修复它,但有时它是有效的,不会抛出异常 所以有时候它抛出一个异常,有时候它工作。我不更改队列的任何设置,也不更改代码 你知道为什么会这样吗?我也有同样的问题,这篇文章帮助了我: 我意识到异常消息实际上是不正确的。它给人的印象是“在启用了
故障异常
:
批处理具有不同SessionId、PartitionKey或
具有分区和分区的实体不支持MessageId
已启用重复检测
异常的消息是不言自明的,我会尝试修复它,但有时它是有效的,不会抛出异常
所以有时候它抛出一个异常,有时候它工作。我不更改队列的任何设置,也不更改代码
你知道为什么会这样吗?我也有同样的问题,这篇文章帮助了我: 我意识到异常消息实际上是不正确的。它给人的印象是“在启用了重复检测的情况下不支持distinct…MessageId”,而实际上它是必需的 因此,在我创建一条消息之后: var message=新消息(Encoding.UTF8.GetBytes()) 我添加了这行代码,它起了作用:
message.MessageId=Guid.NewGuid().ToString() 这可能是因为批处理中包含的消息将进入不同的分区。批处理只能包含一个分区的消息。在我的例子中,我的分区是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);
}
}
当它成功时,整个批处理实际上属于同一个会话吗?您可以确认,当它工作时,实体/消息的状态是相同的吗?您是否在传入消息的上下文中发送(“发送通过”)?@Mikhail我们不显式使用会话,它是否可以隐式使用,因为我们缓存并重用QueueClient?@SeanFeldman不确定相同状态的含义,但我们发送的消息仅在特定于域的值上有所不同,我们不为
messageid
或partitionkey
或sessionid
分配任何值。而且,不,我们不是在传入消息的上下文中发送。@Alexikilinda Ok。。。但是您的队列是否已分区,是否启用了重复检测?