masstransit with rabbitmq:为什么消息在发布时自动移动到\u跳过队列

masstransit with rabbitmq:为什么消息在发布时自动移动到\u跳过队列,rabbitmq,servicebus,masstransit,Rabbitmq,Servicebus,Masstransit,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.

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>();
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
但是,当我发布消息并使用相同的bus Topshelf服务使用该消息时,它是有效的


任何关于此体系结构的帮助或其他见解都将不胜感激

我猜它在为OrderCreatedMessage消息创建消费者时遇到了问题

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

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

我猜它在为OrderCreatedMessage消息创建消费者时遇到了问题

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

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

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

对于接收端点,似乎消费者在某一点上是正确的,这解释了为什么绑定存在,但当前可能没有使用正确的消息类型。消息类型必须与使用者和发布者中的消息约定相同,才能由使用者使用消息

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

bus.GetProbeResult().ToJsonString()

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

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

对于接收端点,似乎消费者在某一点上是正确的,这解释了为什么绑定存在,但当前可能没有使用正确的消息类型。消息类型必须与使用者和发布者中的消息约定相同,才能由使用者使用消息

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

bus.GetProbeResult().ToJsonString()

这将显示正在注册的使用者和正在使用的消息类型。它还将大大有助于解决您看到的问题。

我刚刚开始使用Masstransit和RabbitMQ。以上的答案确实给了我正确的方向,但仅供将来参考。我在RabbitMQ中得到了额外的队列,因为Exunge上有不正确的重复绑定,我没有注意到这一点,因为代码似乎正确,但RabbitMQ中的不正确设置仍然存在。删除队列并重新启动解决了这个问题。

我刚刚开始使用Masstransit和RabbitMQ。以上的答案确实给了我正确的方向,但仅供将来参考。我在RabbitMQ中得到了额外的队列,因为Exunge上有不正确的重复绑定,我没有注意到这一点,因为代码似乎正确,但RabbitMQ中的不正确设置仍然存在。删除队列并重新启动解决了此问题。

谢谢,Assembly.GetExecutionGassembly中没有定义消息的类型。所以绑定接收终结点为空,我尝试了其他方法来获取程序集,并且它工作正常。谢谢,并且assembly.GetExecutionGassembly中没有定义消息的类型。因此绑定接收终结点为空,我尝试了其他方法来获取程序集,它工作正常。是的,OrderCreatedMessage消息的使用者未注册。谢谢。是的,OrderCreatedMessage消息的消费者未注册。谢谢