Demo下载地址:https://download.csdn.net/download/u010312811/11259742
.Net下操作RabbitMQ最常用的SDK是RabbitMQ.Client和EasyNetQ,EasyNetQ操作简单,更容易上手。
相关文章很多,但是大都是翻译自官方的Demo,一堆的控制台程序做消息【发布/订阅】显然不是我们在生产环境所期望的,所以本文以Asp.net MVC为例,介绍如何使用EasynetQ。
1.创建Asp.net MVC项目
项目结构如上图所示,Services文件夹包含了消息队列操作的相关接口,Models文件夹包含了测试需要用到的模型。
2.添加依赖
本文用到的组件包含:EasyNetQ、Autofac、NlLog。
添加依赖:
- Autofac、Autofac.Mvc5
- EasyNetQ
- NLog
其他的依赖如:RabbitMQ.Client、Newtonsoft.Json会自动添加,不需要单独手动添加。
3.消息队列接口
3.1 IMQService
public interface IMQService
{
void InitMQ();
void PublishMessage<T>(T message) where T : class;
void SubscribeMessage();
}
该接口中我们添加了三个接口:
- InitMQ:初始化消息队列
- PublishMessage:消息发布
- SubscribeMessage:消息订阅
3.2 RabbitMQService
public class RabbitMQService:IMQService
{
IBus bus;
public RabbitMQService()
{
}
public void InitMQ()
{
bus = RabbitHutch.CreateBus("host=localhost", x => x.Register<IConsumerErrorStrategy>(_ => new AlwaysRequeueErrorStrategy()));
//订阅消息
SubscribeMessage();
}
public void PublishMessage<T>(T message)
where T:class
{
bus.Publish<T>(message);
}
public void SubscribeMessage()
{
bus.SubscribeAsync<Question>("subscribe_question", x => HandleMessageAsync(x).Invoke(1));
}
private Func<int,Task> HandleMessageAsync(Question question)
{
return async (id) =>
{
if (new Random().Next(0, 2) == 0)
{
Console.WriteLine("Exception Happened!!!!");
NLogHelper.Info("Exception Happened!!!!" + " " + question.Text);
throw new Exception("Error Hanppened!" + " " + question.Text);
}
else
{
NLogHelper.Info("BEGIN");
Thread.Sleep(10000);
Console.WriteLine(string.Format("worker:{0},content:{1}", id, question.Text));
NLogHelper.Info(string.Format("worker:{0},content:{1}", id, question.Text));
}
};
}
}
RabbitMQService是对消息队列接口的实现,包含了队列的初始化、发布、订阅。
初始化方法仅需要在程序启动时注册一次
SubscribeMessage方法用于指明消息队列的订阅方法。本例中指明了对类型为 Question 的消息使用方法 HandleMessageAsync 处理。
4.测试
参考
https://github.com/EasyNetQ/EasyNetQ/issues/734
https://github.com/EasyNetQ/EasyNetQ/issues/504
https://blog.csdn.net/chenludaniel/article/details/86138288