【问题标题】:Can an async method await multiple responses?异步方法可以等待多个响应吗?
【发布时间】:2019-06-01 09:26:06
【问题描述】:

我在空闲时间了解更多关于公共交通的信息。请看下面的代码:

var serviceAddress = new Uri("rabbitmq://localhost/check-order-status");
var client = bus.CreateRequestClient<CheckOrderStatus>(serviceAddress);
var response = await client.GetResponse<OrderStatusResult>(new { OrderId = id});

我从这里拿的:http://masstransit-project.com/MassTransit/usage/request-response.html

GetResponse 向有 x 个消费者的 rabbitmq 扇出交换发送消息。每个消费者都需要向发布者发送回复,但是上面的代码只会收到一个回复​​然后继续。它如何收到 x 回复?

我已经设法使用 RabbitMQ(没有 Mass Transit)做到这一点,如下所示:https://dotnetcodr.com/2014/05/12/messaging-with-rabbitmq-and-net-c-part-5-headers-and-scattergather/。但是,我无法弄清楚如何通过公共交通来做到这一点。

异步方法可以等待多个回复吗?

更新

使用处理程序似乎可以工作:

 sbc.ReceiveEndpoint(host, myMessage.Id.ToString(), ep =>
                {
                    ep.Handler<MyMessage>(context =>
                    {
                        testlist.Add(context.Message);
                        return Console.Out.WriteLineAsync($"Received: {context.Message.Name}");
                    });
                });

我现在可以访问发件人内部的测试列表。

【问题讨论】:

    标签: c# async-await rabbitmq masstransit


    【解决方案1】:

    我相信您应该能够通过使用Task.WhenAll(IEnumerable) 实现与分散/聚集示例类似的行为。 Mass Transit 请求-响应页面中有一个部分介绍如何在Composing multiple results 上使用它。

    按照 Mass Transit 中的示例代码,假设您在一个字段中存储了多个 serviceAddress:

    ICollection<Uri> _serviceAddresses;
    

    如果您想获得所有客户端的 CheckOrderStatus 响应,您可以按如下方式进行:

    var getResponseTasks = new List<Task<Response<CheckOrderStatus>>>();
    foreach(var serviceAdress in _serviceAddresses)
    {
        var client = bus.CreateRequestClient<CheckOrderStatus>(serviceAddress);
        getResponseTasks.Add(client.GetResponse<OrderStatusResult>(new { OrderId = id}));
    }
    
    await Task.WhenAll(getResponseTasks);
    

    现在您只需解开结果:

    var responses = new List<Response<CheckOrderStatus>>();
    foreach(var responseTask in getResponseTasks)
    {
        var response = await responseTask;
        responses.Add(response);
    }
    

    【讨论】:

    • 这不是意味着发布者必须知道所有消费者是谁吗?解耦分布式系统的全部要点避免了这种情况。如果我单独使用 rabbitmq(没有公共交通),那么发布者不知道 x(x 是一个数字)消费者是谁。如果我使用公共交通,那么看来我必须对发布者内部的消费者进行硬编码(就像你所做的那样)。我是否正确理解了这一点?谢谢。
    • @w0051977 你的评论不清楚,他给你看的和你做的有什么不同
    • @johnny 5,我想说的是,发送者必须知道所有接收者是谁。如果我单独使用 RabbitMQ,那么发送者不需要知道接收者是谁,如我的问题的第二个链接所示。这有意义吗?
    • 在使用公共交通实施分散/聚集时,发送方是否必须知道所有接收方?
    • @w0051977 看起来我可能误解了你想要达到的目标。我是否正确,您没有尝试从多个“RequestClients”收集数据,但您想处理来自单个服务的多个响应?
    猜你喜欢
    • 1970-01-01
    • 2016-02-23
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多