我在空闲时间学习更多关于公共交通的知识。 请参阅下面的代码:
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(没有公共交通(做到这一点,就像这样: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}");
});
});
我现在可以访问发件人内部的测试列表。
你应该能够通过使用Task.WhenAll(IEnumerable(实现与scatter/gather示例类似的行为。公共交通请求-响应页面中有一节介绍如何在撰写多个结果时使用它。
按照公共交通中的示例代码,假设您在一个字段中存储了多个服务地址:
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);
}