在
第一章里,我们已经简单的使用了MassTransit的推送、接收功能,但目前都还只是单方面的推送、接收,实际场景中,我们更多的是会碰到需要返回值的情况,而这一章,就是讲述下在MassTransit中如何进行Request、Response。
MassTransit中提供接口IRequestClient<TRequest, TResponse>来定义Request/Response模式,其具体实现类为MessageRequestClient<TRequest, TResponse>。
现在我们来修改一下上篇中的代码,因为上篇只是一个简单的入门例子,所以将推送、接收代码都写在了一个控制台程序里面,这里为了与更符合真实情况,将新建一个客户端控制台,其代码也是之前的代码复制过来,删除接收部分后再稍作调整、并加入Request/Response部分
var rbBus = Bus.Factory.CreateUsingRabbitMq(configure =>
{
var host = configure.Host(new Uri("rabbitmq://192.168.5.136/"), h =>
{
h.Username("guest");
h.Password("guest");
});
});
using (rbBus.Start())
{
string text = string.Empty;
do
{
text = Console.ReadLine();
string endPoint = null;
if (text.Contains(":"))//设定endpoint与message通过:分割
{
var tmp = text.Split(':');
endPoint = tmp[0];
text = tmp[1];
}
if (string.IsNullOrWhiteSpace(endPoint))
{
rbBus.Publish<IMessageContract>(new { Value = text });
}
else
{
var uri = new Uri($"rabbitmq://192.168.5.136/{endPoint}");
if (endPoint == "callback")
{//设定callback为request/response
MessageRequestClient<MessageContract, MessageContract> client =
new MessageRequestClient<MessageContract, MessageContract>(rbBus, uri, TimeSpan.FromSeconds(10));
var response = client.Request(new MessageContract { Value = text }, default(CancellationToken)).Result;
Console.WriteLine("Get Response:" + response.Value);
}
else
{
var point = rbBus.GetSendEndpoint(uri).Result;
point.Send<IMessageContract>(new { Value = $"Send To {endPoint} { text}" });
}
}
}
}
上面的代码中,我们只需关注callback部分的代码,可以注意到,这里用了同一个类MessageContract而不是接口来作为Request和Response的契约,这是因为与单向的推送、接收不同,
IRequestClient的Request方法设置了泛型约束,而且只提供了一个方法,so……契约定义成接口的方式在这里被打脸了,不知道作者以后会不会修正这里……
看完客户端代码,现在我们在原来的代码里面加入endPoint为callback的接收代码
configure.ReceiveEndpoint(host, "callback", e =>
{
e.Handler<MessageContract>(async context =>
{
await Task.Run(() =>
{
Console.WriteLine("Received By callback:{0}", context.Message.Value);
context.Respond(new MessageContract { Value = "CallBack Message:" + context.Message.Value });
});
});
});
注意这里为了方便起见,采用了handler的方式,在这里简单的通过Respond<T>方法来实现消息的反馈,除了这个同步方法外,MassTransit 还提供了一系列的异步方法,读者也可以自行尝试。