如何使用Redis MQ从Dead Letter Queue重新发送?

JD.*_*JD. 6 redis servicestack

刚刚花了我几个小时看Redis和Redis MQ.

慢慢地掌握Redis,并想知道如何重新发送死信队列中的消息?

此外,配置选项在哪里确定消息在进入死信队列之前被重试的次数?

Bri*_*vez 4

目前, ServiceStack中无法自动重发死信队列中的消息。但是,您可以相对轻松地手动执行此操作:

要从死信队列重新加载消息,请使用:

  public class AppHost {

      public override Configure(){

           // create the hostMq ...
           var hostMq = new RedisMqHost( clients, retryCount = 2 );

           // with retryCount = 2, 3 total attempts are made. 1st + 2 retries

           // before starting hostMq
           RecoverDLQMessages<TheMessage>(hostMq);

           // add handlers
           hostMq.RegisterHandler<TheMessage>( m => 
                     this.ServiceController.ExecuteMessage( m ) );

           // start hostMq
           hostMq.Start();
      }
  }
Run Code Online (Sandbox Code Playgroud)

最终使用以下内容来恢复(重新排队)消息:

    private void RecoverDLQMessages<T>( RedisMqHost hostMq )
    {
        var client = hostMq.CreateMessageQueueClient();

        var errorQueue = QueueNames<T>.Dlq;
        log.Info( "Recovering Dead Messages from: {0}", errorQueue );
        var recovered = 0;

        byte[] msgBytes;
        while( (msgBytes = client.Get( errorQueue, TimeSpan.FromSeconds(1) )) != null )
        {
            var msg = msgBytes.ToMessage<T>();
            msg.RetryAttempts = 0;
            client.Publish( msg );
            recovered++;
        }

        log.Info( "Recovered {0} from {1}", recovered, errorQueue );
    }
Run Code Online (Sandbox Code Playgroud)

笔记

在撰写本文时, ServiceStack可能会丢失消息。请参阅此处的问题 229,因此,当进程将消息从 DLQ(死信队列)移回到输入队列时,不要终止该进程。在底层,ServiceStack正在从 Redis POPing 消息。