【问题标题】:MassTransit Respond going to same queue and causing loopMassTransit 响应进入同一队列并导致循环
【发布时间】:2016-12-02 20:01:31
【问题描述】:

我们目前正在将NServiceBus 换成MassTransit,我在请求/响应模式方面遇到了一点困难。

NServiceBus 中,我可以在Handler 中回复,它会返回给发送它的客户端。

MassTransit 中,似乎响应正在被发送回使用它的队列,从而创建了一个循环...

奇怪的是,如果我使用 InMemory 创建总线,并且客户端和消费者都在同一台机器上,我没有问题。

我希望我的客户能够收到响应,但我的 Consumer 却收到了它,这也很奇怪,因为它没有设置为接收该消息类型...

我是否在客户端的请求设置中遗漏了什么?

客户:

....
IRequestClient<IWorklistRequest, IWorklistResponse> client = CreateRequestClient(busControl, WorklistEndpointUri);

Console.Write("Sending Request");

Task.Run(async () =>
{
    IWorklistRequest request = new WorklistRequest
    {
        CurrentDateFrom = new DateTime(2016, 11, 07)
    };

    var response = await client.Request(request);

    Console.WriteLine("Worklist Items retrieved: {0}", response.ExamItemList.Length);

}).Wait();
....



static IRequestClient<IWorklistRequest, IWorklistResponse> CreateRequestClient(IBusControl busControl, string endpointAddress)
{
    Console.WriteLine("Creating Request client...");

    var serviceAddress = new Uri(endpointAddress);
    IRequestClient<IWorklistRequest, IWorklistResponse> client =
    busControl.CreateRequestClient<IWorklistRequest, IWorklistResponse>(serviceAddress, TimeSpan.FromSeconds(10));

    return client;
}

消费者:

    public Task Consume(ConsumeContext<IWorklistRequest> context)
    {
        _log.InfoFormat("Received Worklist Request with Id: {0}", context.RequestId);


        try
        {
            var result = _provider.GetAllWorklistsByStartDate(context.Message.CurrentDateFrom);

            IWorklistResponse response = new WorklistResponse
            {
                ExamItemList = result.ToArray()
            };

            // the below is sending the response right back to the original queue and is getting picked up again by this same consumer
            context.Respond(response);
        }
        catch (Exception ex)
        {
            _log.Info(ex.Message);
        }

        return Task.FromResult(0);
    }

【问题讨论】:

    标签: c# windows-services servicebus masstransit


    【解决方案1】:

    如果您使用的是 RabbitMQ,并且您正在使用请求客户端,您应该不会看到这种行为。

    在 MassTransit GitHub 存储库中有一个示例演示了如何使用请求客户端:https://github.com/MassTransit/Sample-RequestResponse

    上面的代码看起来是正确的,Respond() 调用应该使用请求消息中的响应地址,这是一个直接端点发送到临时总线地址。

    在这个领域有相当广泛的单元测试覆盖范围,上面的示例已使用最新版本的 MassTransit 进行了更新和验证。您可以考虑删除/重新创建您的 RabbitMQ 虚拟主机并从头开始运行您的应用程序(首先启动响应服务,以便设置端点)。

    【讨论】:

    • 是的,这就是我实际使用的示例来指导我的实现...我会看看重新创建 RabbitMq 主机是否可以解决这个问题,它是我与 NServiceBus 一起使用的现有主机.
    • 删除并重新创建了 RabbitMQ 主机,问题仍然存在。它说它找不到响应端点。当客户端和总线都在同一台机器上时,这不是问题。
    • 两个服务是否使用相同的地址连接到 RabbitMQ?还是其中一个使用不同的主机地址?例如,一个使用本地主机,另一个使用网络名称?另外,不要通过 RabbitMQ 远程使用访客帐户。
    • 是的,接收方使用localhost,客户端使用IP。我没有使用访客帐户。
    • 两者都需要使用IP,不能混用。另一端无法解析本地主机。
    猜你喜欢
    • 1970-01-01
    • 2021-11-20
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多