2017-07-07 109 views
0

如何从死信队列中读取消息并将其放回交易范围内的父队列中,因为只有一个顶级实体能够参与交易?通常情况下,我会使用传输队列将消息从一个队列移动到另一个队列作为原子操作,但我不相信DLQ有传输队列,即使他们这样做,我也不会遇到处理传输的问题排队DLQ!在交易范围内重新提交死信队列消息

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

回答

0

Azure服务总线不允许重新提交消息。您需要发送带有更正数据的新消息。对于在DLQ中找到的消息,您可以推迟原始消息,提交副本,如果成功,则使用您最初推迟推送时收到的序列号接收和删除原始DLQed消息。

类似的事情由ServiceBus360与Deferred DLQ feature实现。

0

虽然这是事实,你不能重新提交DLQ消息,有点调查和反复试验后,我发现了以下工作得好:

  1. 克隆使用BrokeredMessage.Clone的DLQ消息()
  2. BrokeredMessage.Properties
  3. 卸下DeadLetterReasonDeadLetterErrorDescription条目在内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(); 
}