MassTransit - 当消息Q关闭时,PublishFault停止工作

时间:2016-02-10 11:37:16

标签: c# .net rabbitmq masstransit

我正在使用下面的代码(和RabbitMQ)连接发布观察者。当RabbitMQ运行时,它运行良好 - 我可以在PostPublish和PrePublish上看到控制台消息。

但是,当我停止RabbitMQ并发布时,PublishFault会运行一次,但是当RabbitMQ保持停止状态时再也不会。

如果发布失败,我试图将消息持久保存到另一个数据存储区(以及日志和错误) - 我认为PublishFault方法最适合这样做。如果仅检测到第一个故障,则这不起作用。

预计会出现这种情况吗?是否有更好的方法来实现失败的消息持久性。

PS ......一旦我再次启动RabbitMQ,我就会看到所有的PrePublish和PostPublish调试消息,以查找失败的消息。我认为,这是可以预期的。

using MassTransit;
using MassTransit.Pipeline;
using System;
using System.Threading.Tasks;


namespace Mtt.Publisher
{
    class Program
    {
        static void Main(string[] args)
        {
            IBusControl busControl = Bus.Factory.CreateUsingRabbitMq(sbc =>
            {
                var host = sbc.Host(new Uri("rabbitmq://localhost"), h =>
                {
                    h.Username("user");
                    h.Password("pass");
                });

                sbc.UseRetry(Retry.Immediate(5));
            });

            busControl.Start();
            busControl.ConnectPublishObserver(new PublishObserver());

            var input = "";

            while (input != "exit")
            {
                input = Console.ReadLine();
                busControl.Publish<Test>(new TestMessage());
            }

            busControl.Stop();
        }
    }

    public interface Test { }
    public class TestMessage : Test { }

    public class PublishObserver : IPublishObserver
    {
        public async Task PostPublish<T>(MassTransit.PublishContext<T> context) where T : class
        {
            Console.WriteLine("--- POST PUBLISH ----");
        }


        public async Task PrePublish<T>(MassTransit.PublishContext<T> context) where T : class
        {
            Console.WriteLine("**** PRE PUBLISH ****");
        }


        public async Task PublishFault<T>(MassTransit.PublishContext<T> context, Exception exception) where T : class
        {
            Console.WriteLine("%%%%%% EXCEPTION %%%%%%%");
        }
    }
}

0 个答案:

没有答案