繁体   English   中英

masstransit和rabbitmq:为什么消息在发布时自动移至_skipped队列

[英]masstransit with rabbitmq: Why message auto moved to _skipped queue when it published

MassTransit.3.1.2 MassTransit.Autofac.3.1.1 MassTransit.RabbitMQ.3.1.1 RabbitMQ.Client.3.6.0 Topshelf.3.3.1

一个Topshelf Windows服务,创建一个这样的总线实例:

var builder = new ContainerBuilder();
builder.RegisterConsumers(Assembly.GetExecutingAssembly());
builder.Register<IBusControl>(context =>
        {
            return Bus.Factory.CreateUsingRabbitMq(rbmq =>
            {
                var host = rbmq.Host(new Uri("rabbitmq://" + BusConfig.Instance.Host + ":" + BusConfig.Instance.Port + "/" + BusConfig.Instance.VHost), h =>
                {
                    h.Username(BusConfig.Instance.UserName);
                    h.Password(BusConfig.Instance.Password);
                });
                rbmq.UseJsonSerializer();
                rbmq.UseNLog();

                rbmq.ReceiveEndpoint(BusConfig.Instance.Queue, edp =>
                {
                    edp.UseRetry(Retry.Incremental(5, TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(5)));
                    edp.LoadFrom(context);
                });
            });
        }).SingleInstance().As<IBusControl>().As<IBus>();

        return builder.Build().Resolve<IBusControl>();

这样的一个控制台应用程序:

var bus = Bus.Factory.CreateUsingRabbitMq(rbmq =>
           {
               var host = rbmq.Host(new Uri("rabbitmq://" + BusConfig.Instance.Host + ":" + BusConfig.Instance.Port + "/" + BusConfig.Instance.VHost), h =>
               {
                   h.Username(BusConfig.Instance.UserName);
                   h.Password(BusConfig.Instance.Password);
               });
           });
        bus.Start();
        var msg = new OrderCreatedMessage() { OrderId = 10102 };

        bus.Publish<OrderCreatedMessage>(msg);

在控制台应用程序发布消息时,以“ BusConfig.Instance.Queue”命名的Rabbitmq队列收到OrderCreatedMessage:

消息发布时的Rabbitmq队列视图

然后我启动了topshelf服务,将OrderCreatedMessage自动删除到_skipped队列:

启动topshelf服务时的Rabbitmq队列视图

像这样的大众运输日志:

MOVE:rabbitmq:\/\/192.168.12.217:5672\/zst\/zst.order.queue?prefetch=8:rabbitmq:\/\/192.168.12.217:5672\/zst\/zst.order.queue_skipped?bind=true&queue=zst.order.queue_skipped:N\/A:Moved

但是,当我发布消息并使用同一总线(Topshelf服务)使用消息时,它可以正常工作!!!

对此结构的任何帮助或其他见解将不胜感激!

查看发布消息类型的交换与服务端点的输入队列的交换之间的绑定。 确保正确绑定了正确的类型交换。 由于邮件已传递,因此我猜这部分是正确的。

对于接收端点,似乎消费者在某一点上是正确的(这说明了绑定存在的原因),但是当前可能没有使用正确的消息类型。 消息类型必须与使用者和发布者中的消息合同相同,这样消息才可以被使用者使用。

当消息移至_skipped时,该端点上没有任何使用者实际在消息本身中使用消息类型。 我建议发布以下输出以供审核:

bus.GetProbeResult().ToJsonString()

这将显示正在注册的使用者和正在使用的消息类型。 它还将极大地帮助您解决所遇到的问题。

我猜它在创建OrderCreatedMessage消息的使用者时遇到问题。

您是否尝试过仅在构建器中自行解决消费者问题?

var test = builder.Resolve<OrderCreatedMessageConsumer>();

我刚刚开始使用Masstransit和RabbitMQ。 上面的答案确实向正确的方向发送了我,但仅供将来参考。 我在RabbitMQ中获得了额外的队列,因为扩展名不正确(重复绑定已打开),并且我没有注意到这一点,因为代码似乎正确,但是RabbitMQ中的错误设置仍然存在。 删除队列并重新开始即可解决。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM