rabbitmq MassTransit 6.3.2使用IBusControl时从不调用使用者,

lg40wkob  于 2023-01-26  发布在  RabbitMQ
关注(0)|答案(1)|浏览(166)

当我在初始消息总线配置过程中附加消费者时,消费者会按预期被调用。
当我在总线配置之后连接消费者时,使用ConnectConsumer,消费者永远不会被调用;创建了临时队列/交换,但是它看起来并不知道应该连接到该队列的使用者。
总线上还有另一个服务/使用者,它接收在这里发布的请求消息,并发布应该在这里使用的响应消息。
你知道为什么这行不通吗?
注意:我知道在总线配置中将消费者连接到总线的"首选"方式(如工作示例中所示);这对我来说不是一个选项,因为在实践中,总线是在引用的程序集中创建/配置的,并且向总线添加消费者的最终用户程序员没有访问总线配置方法的权限。似乎较新版本使此类用例更加困难-并非所有用例都能轻松访问总线创建/配置方法。
前。

public class TestResponseConsumer : IConsumer<ITestResponse>
{
    public Task Consume(ConsumeContext<ITestResponse> context)
    {
        Console.WriteLine("TestResponse received");

        return Task.CompletedTask;
    }
}

    ...

这是可行的(消费者被呼叫):

public IBusControl ServiceBus;

    public IntegrationTestsBase()
    {
        ServiceBus = Bus.Factory.CreateUsingRabbitMq(cfg =>
        {
            cfg.Host("vmdevrab-bld", "/", h => {
                h.Username("guest");
                h.Password("guest");
            });

            cfg.ReceiveEndpoint("Int_Test", e =>
            {
                e.Consumer<TestResponseConsumer>();
            });

            cfg.AutoStart = true;
        });

        ServiceBus.Start();
    }

    ~IntegrationTestsBase()
    {
        ServiceBus.Stop();
    }
}

这是行不通的:

[TestMethod]
    public void Can_Receive_SampleResponse()
    {
        try
        {
            ITestRequest request = new TestRequest(Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid());

            ServiceBus.ConnectConsumer<TestResponseConsumer>();

            ServiceBus.Publish<ITestRequest>(request);

            mre.WaitOne(60000);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            Console.WriteLine(ex.StackTrace);
            Assert.Fail();
        }
    }
wnavrhmk

wnavrhmk1#

它不起作用,因为正如文档中所解释的,当您将使用者连接到总线端点时,没有创建交换绑定。已发布的消息将不会传递到总线端点。
如果您希望在总线启动后将使用者连接到总线,则应改用ConnectReceiveEndpoint(),文档中也介绍了这一点。

var handle = bus.ConnectReceiveEndpoint("secondary-queue", x =>
{
    x.Consumer<TestResponseConsumer>();
})

var ready = await handle.Ready;

端点可以在不再需要时停止,否则将在总线停止时停止。

相关问题