2017-02-15 47 views
0

我正在尝试使用MassTransit和Azure Service Bus创建一个应用程序,请参阅这篇文章http://docs.masstransit-project.com/en/latest/advanced/turnout.html如何使用MassTransit从道岔队列中检索消息?

在Azure Service Bus中启动应用程序后,创建了两个队列(其中一个队列已过期)。而且在我执行订阅者之后被创建的投票队列和消息被从main移动到这个队列。如果用户工作,我可以检索邮件。如果我停止用户(杀死进程或关机)消息仍在轮流队列中。下次我执行订阅者时,它会创建新的投票队列,并且不会检索已处理但未完成的邮件。那么,我怎么能不失去信息呢?另外我如何设置在一个节点中处理的消息的最大数量限制?

_busControl = Bus.Factory.CreateUsingAzureServiceBus(cfg => 
     { 
      var host = cfg.Host("********", h => 
      { 
        //h.OperationTimeout = TimeSpan.FromMinutes(1); 
      }); 
      cfg.MaxConcurrentCalls = 1; 
      cfg.UseServiceBusMessageScheduler(); 
      cfg.TurnoutEndpoint<ISimpleRequest>(host, "test_longruning", 
       e => 
       { 
        e.SuperviseInterval = TimeSpan.FromSeconds(30); 
        e.PartitionCount = 1; 
        e.SetJobFactory(async context => 
         { 
          Console.WriteLine($"{DateTime.Now} Start Message: {context.Command.CustomerId}"); 
          await Task.Delay(TimeSpan.FromMinutes(7), context.CancellationToken); 
          Console.WriteLine($"{DateTime.Now} End Message: {context.Command.CustomerId}"); 
         }); 
       }); 
     }); 

回答

0

首先,我应该警告您,Turnout在这一点上是非常实用的。虽然它在快乐的道路上运行,但服务故障的处理还没有完全消除。虽然消息生存时间设置应该以命令返回正确的队列结束,但它还没有经过广泛的测试。

也就是说,您可以使用ServiceBusExplorer将消息移回适当的队列,这就是我的做法。它是手动的,但它是唯一真正能够完全控制服务总线环境的工具。

相关问题