如何使用MassTransit从道岔队列中检索消息?

时间:2017-02-15 15:46:39

标签: c# .net azureservicebus masstransit

我试图在本文http://docs.masstransit-project.com/en/latest/advanced/turnout.html之后使用MassTransit和Azure Service Bus创建应用程序。

我在Azure Service Bus中启动应用程序后创建了两个队列(其中一个已过期)。在我执行订阅后,创建了投票队列,消息从main移到了这个队列。如果订户工作,我可以检索消息。如果我停止订阅(kill process或shutdown machine)消息仍然在交出队列中。下次我执行订阅时,它会创建新的投票队列,并且我不会检索已处理但未完成的消息。那么,我怎么能不丢失消息呢?还有我如何设置在一个节点中处理的消息的最大数量限制?

_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}");
                        });
                });
        });

1 个答案:

答案 0 :(得分:0)

首先,我应该警告你,此时道岔是非常预生产的。虽然它在快乐的道路上工作,但服务故障的处理还没有达到目标。虽然消息的生存时间设置应该以正确的队列中的命令结束,但它还没有经过广泛的测试。

也就是说,您可以使用ServiceBusExplorer将消息移回正确的队列,这就是我的工作方式。它是手册,但它是真正让您完全控制服务总线环境的唯一工具。