【EasyNetQ笔记】Request/Response、Send/Receive模式
Request/Response模式
介绍
EasyNetQ也支持Request/Response
这种方式的消息模式。适合在client/Server
应用中执行,客户端发送一个请求到服务器,服务器然后处理请求后返回一个响应。和传统的RPC机制不同,EasyNetQ request/response
操作不需要url
,仅仅需要简单的定义一对request/response
消息类型。
发送同步请求
var myRequest = new MyRequest{Text ="hello Server"};
var response = bus.Request<MyRequest, MyResponse>(myRequest);
Console.WriteLine(response.Text);
发送异步请求
通常来说,使用RequestAsync方法返回一个Task是比较好的选择。
var task = bus.RequestAsync<TestRequestMessage,TestResponseMessage>(request);
task.ContinueWith(response =>{
Console.WriteLine("Got Response:{0}",
response.Result.Text);
});
同步响应
bus.Respond<MyRequest,MyResponse>(request =>
new MyResponse{ Text ="Responding to " + request.Text});
Respond
带有单个参数Func<TRequest, TResponse>
,接收一个请求并返回响应。假如你有持续很长时间的IO,应该使用ResponseAsync。
异步响应
EasynetQ也提供了一个RespondAsync
方法,它带有一个Func<TRequest,Task>
委托参数。它允许你执行持续很长时间IO密集型的操作,而不会阻塞EasyNetQ订阅处理循环。
static void Main(string[] args)
{
//创建一组工作线程对象。
var workers = new BlockingCollection<MyWorkder>();
for(int i = 0; i < 10; i++)
{
workers.Add(new MyWorker());
}
//创建一个Bus
var bus = RabbitHutch.CreateBus("host=localhost");
//响应请求。
bus.RespondAsync<RequestServerTime, ResponseServerTime>(
request =>
Task.Factory.StartNew(() =>
{
var worker = worker.Take();
try
{
return worker.Execute(request);
}
finally
{
workers.Add(worker);
}
}));
Console.ReadLine();
bus.Dispose();
}
Send/Receive模式
发布/订阅和请求/响应模式是位置透明的,因为您不需要指定消息的使用者所在的位置,而发送/接收模式专门用于通过命名队列进行通信。它也不会假设可以通过队列发送的消息类型。这意味着您可以通过同一队列发送不同类型的消息。
发送/接收模式非常适合创建“命令管道”,您需要将缓冲通道发送到单个命令处理器。
要发送消息,请使用IBus上的Send方法,指定要将消息发送到的队列的名称以及消息本身:
bus.Send("my.queue", new MyMessage{ Text = "Hello Widgets!" });
要为特定消息类型设置消息接收器,请使用IBus上的Receive方法:
bus.Receive<MyMessage>("my.queue", message => Console.WriteLine("MyMessage: {0}", message.Text));
您可以使用带有Action
bus.Receive("my.queue", x => x
.Add<MyMessage>(message => deliveredMyMessage = message)
.Add<MyOtherMessage>(message => deliveredMyOtherMessage = message));
如果消息到达没有匹配接收器的接收队列,EasyNetQ会将消息写入EasyNetQ错误队列,并显示“未找到消息类型<消息类型>的处理程序”。