Azureservicebus 在事务作用域内重新提交死信队列消息

Azureservicebus 在事务作用域内重新提交死信队列消息,azureservicebus,azure-servicebus-queues,dead-letter,Azureservicebus,Azure Servicebus Queues,Dead Letter,考虑到只有一个顶级实体能够参与事务的限制,如何从死信队列读取消息并将其放回事务范围内的父队列?通常我会使用传输队列将消息作为原子操作从一个队列移动到另一个队列,但我不相信DLQ有传输队列,即使有,我也不会有处理传输队列DLQ的问题 我需要以安全的方式执行此重新提交,并且不会在重新提交过程中丢失消息。Azure Service Bus不允许重新提交消息。您需要发送一条带有更正数据的新消息。对于在DLQ中找到的消息,您可以延迟原始消息,提交副本,如果成功,则按照最初延迟时收到的序列号接收并删除原始D

考虑到只有一个顶级实体能够参与事务的限制,如何从死信队列读取消息并将其放回事务范围内的父队列?通常我会使用传输队列将消息作为原子操作从一个队列移动到另一个队列,但我不相信DLQ有传输队列,即使有,我也不会有处理传输队列DLQ的问题


我需要以安全的方式执行此重新提交,并且不会在重新提交过程中丢失消息。

Azure Service Bus不允许重新提交消息。您需要发送一条带有更正数据的新消息。对于在DLQ中找到的消息,您可以延迟原始消息,提交副本,如果成功,则按照最初延迟时收到的序列号接收并删除原始DLQed消息


ServiceBus360通过实现了类似的功能。

虽然您确实无法重新提交DLQ消息,但经过一番调查和反复试验,我发现以下功能运行良好:

使用BrokeredMessage.Clone克隆DLQ消息 从BrokeredMessage.Properties中删除DeadLetterReason和DeadLetterErrorDescription条目 在TransactionScope内部,将克隆的消息发送回原始队列并完成DLQ消息。 以下是一个例子:

using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
   // Create new message
   var resubmittableMessage = originalMessage.Clone();

   // Remove dead letter reason and description
   resubmittableMessage.Properties.Remove("DeadLetterReason");
   resubmittableMessage.Properties.Remove("DeadLetterErrorDescription");

   // Resend cloned DLQ message and complete original DLQ message
   await Task.WhenAll(_messageSender.SendAsync(resubmittableMessage), originalMessage.CompleteAsync());

   // Complete transaction
   scope.Complete();
}