除非订户在场,否则为什么MassTransit不会将消息推送到MSMQ?这是如何解决的?

时间:2014-01-07 21:18:38

标签: c# .net msmq masstransit

我正在使用MassTransit + MSMQ作为消息传递总线,这似乎取得了合理的成功。但是,对于某些测试,我想要将消息排入队列,但从不将它们排队。似乎正确的方法是不直接订阅队列。这是我的代码:

1)我想在此过程中发送和接收来自同一队列的消息[这有效]:

    var solrMessageBus = ServiceBusFactory.New(sbc =>
        {
            sbc.UseMsmq();
            sbc.VerifyMsmqConfiguration();
            sbc.ReceiveFrom("msmq://localhost/my_queue");
            sbc.Subscribe(subs =>
            {
                subs.Handler<MyMessage>(msg => Enqueue(msg));
            });
        });

2)我想从这个过程发送消息,但不消耗它们。 MSMQ应该建立一个庞大的消息队列[这不起作用]

    var solrMessageBus = ServiceBusFactory.New(sbc =>
        {
            sbc.UseMsmq();
            sbc.VerifyMsmqConfiguration();
            sbc.ReceiveFrom("msmq://localhost/my_queue");
        });

我不是MassTransit专家,但上述似乎是一种合理的排队方式,不会从同一队列中出列消息。在1)中,我看到消息最终出现在我的MSMQ中,但是2)没有消息进入队列。

如何在不将消息出列的情况下构建队列?

2 个答案:

答案 0 :(得分:2)

如果您未在总线上注册任何订阅,则队列将被清空,并且发送到队列的所有消息将最终在_error队列中。

如果只需要向队列发送消息,可以使用EndpointCacheFactory(而不是服务总线工厂)获取IEndpointCache,然后调用GetEndpoint(uri)并使用Send方法向该队列发送消息。这样做的另一个好处是可以避免任何线程池用于接收从未使用过的消息。

另外,快速提醒一下,每个服务总线实例都必须有自己的队列。

答案 1 :(得分:0)

这听起来很合理,但我从未尝试过。

Mass Transit从您的设置中构建订阅映射,然后将订阅映射到队列(使用多播订阅)。请注意,消息从不存储在分配给发件人的队列中,而是将其多播到订阅者。没有订阅者=无处放置您的消息。

要永久地对消息进行排队,我会添加一个订阅者但暂停其消费者线程,直到测试完成。