Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么MassTransit不将消息推送到MSMQ,除非有订阅者在场?这是如何运作的?_C#_.net_Msmq_Masstransit - Fatal编程技术网

C# 为什么MassTransit不将消息推送到MSMQ,除非有订阅者在场?这是如何运作的?

C# 为什么MassTransit不将消息推送到MSMQ,除非有订阅者在场?这是如何运作的?,c#,.net,msmq,masstransit,C#,.net,Msmq,Masstransit,我使用MassTransit+MSMQ作为消息传递总线,这似乎取得了合理的成功。但是,对于某些测试,我希望将消息排队,但决不将它们出列。这样做的正确方法似乎是不直接订阅队列。这是我的密码: 1) 我希望在此过程中从同一队列发送和接收消息[此操作有效]: var solrMessageBus = ServiceBusFactory.New(sbc => { sbc.UseMsmq(); sbc.VerifyMsmqCon

我使用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));
            });
        });
我不是MassTransit专家,但上述方法似乎是一种合理的方法,可以在不让来自同一队列的消息排队的情况下排队。在1)中,我看到消息最终出现在我的MSMQ中,但在2)中,没有消息到达队列


如何在不让消息排队的情况下建立队列?

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

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


为了永远对消息进行排队,我将添加一个订阅者,但暂停其使用者线程,直到测试完成。

如果您没有在总线上注册任何订阅,队列将被清空,发送到队列的所有消息都将进入_错误队列

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


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

这或多或少是正确的。您可以使用静态路由,而不是让您的使用者运行来提供帮助。MT邮件列表可能是更详细讨论的更好地方。
    var solrMessageBus = ServiceBusFactory.New(sbc =>
        {
            sbc.UseMsmq();
            sbc.VerifyMsmqConfiguration();
            sbc.ReceiveFrom("msmq://localhost/my_queue");
        });