本篇将介绍RabbitMq的一个简单使用例子,分别介绍生产者如何发送消息,消费者如何接收和处理消息

关于RabbitMQ的知识背景的文章非常多。我对它的总结是,解决高并发请求的瓶颈,将应用程序真正处理请求的担子推送给一个处理消息的中心,以减轻应用程序本身处理请求的压力。

这个处理中心也即RabbitMQ的消费者,同时,它跟生产者一样,也是RabbitMQ的客户端。

下面将使用RabbitMQ.Client来创建一个生产者客户端,一个消费者客户端:

生产者代码:

        static void Main(string[] args)
{
var facotry = new ConnectionFactory()
{
HostName = "192.168.1.23",
VirtualHost = "/host",
UserName = "admin",
Password = ""
}; using (var con = facotry.CreateConnection())
{
//3. 创建信道
using (var channel = con.CreateModel())
{
//4. 申明队列
channel.QueueDeclare(queue: "wiky_test_queue", durable: false, exclusive: false, autoDelete: false, arguments: null); //5. 构建byte消息数据包
string message = args.Length > ? args[] : "Hello RabbitMQ!"; var body = Encoding.UTF8.GetBytes(message); //6. 发送数据包
channel.BasicPublish(exchange: "", routingKey: "wiky_test_queue", basicProperties: null, body: body); Console.WriteLine(" [x] Sent {0}", message);
}
} }

消费者代码:

        static void Main(string[] args)
{ //1.实例化连接工厂
var facotry = new ConnectionFactory()
{
HostName = "192.168.1.23",
VirtualHost = "/host",
UserName = "admin",
Password = ""
};
//2. 建立连接
using (var connection = facotry.CreateConnection())
{
//3. 创建信道
using (var channel = connection.CreateModel())
{
//4. 申明队列
channel.QueueDeclare(queue: "wiky_test_queue", durable: false, exclusive: false, autoDelete: false, arguments: null);
//5. 构造消费者实例
var consumer = new EventingBasicConsumer(channel);
//6. 绑定消息接收后的事件委托
consumer.Received += (model, ea) =>
{
var message = Encoding.UTF8.GetString(ea.Body);
Console.WriteLine(" [x] Received {0}", message);
Thread.Sleep();//模拟耗时
Console.WriteLine(" [x] Done");
};
//7. 启动消费者
channel.BasicConsume(queue: "wiky_test_queue", autoAck: true, consumer: consumer);
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}
}
}

我们可以看到客户端代码,相同的地方,都要连接MQ服务,创建channel, 然后申明队列。不同的: 一个是发送消息,一个是接受消息和处理消息,接受消息需要创建消费者实例。

上面的代码可以让我们比较容易地理解生产者,消费者的主要工作流程。

当我们了解了上面的基础知识之后,我们在实际开发中,可以对以上的代码进行封装。这个想法,是千千万万开发者的想法,所以有很多的mq代码库。下面我将选用一个最简单的 EasyNetQ。

安装了这个nuget包之后:

先创建一个公开类库,可以被生产者和消费者共享的内容。

定义了一个传输类,一个接口方法用于处理消息

    public class TestEvent
{
public int TestId { get; set; }
public string TestMessage { get; set; }
} public interface ITestSerivce
{
void HandleMessage(TestEvent @event);
}

生产者代码:

public static IBus Bus { get; set; }
static void Main(string[] args)
{
var rabbitMqConnection = "host=192.168.1.23;virtualHost=/host;username=admin;password=123456";
Bus = RabbitHutch.CreateBus(rabbitMqConnection);
Bus.Publish<TestEvent>(new TestEvent()
{
TestId = ,
TestMessage = "Hello Easy MQ!"
});

消费者代码:

先实现处理消息接口

public class TestService : ITestSerivce
{
public void HandleMessage(TestEvent @event)
{
Console.WriteLine($"I am handling the event...{@event.TestId}..{@event.TestMessage}...");
Console.WriteLine("good job!");
}
}

下面是消费队列:

 public static IBus Bus { get; set; }
static void Main(string[] args)
{
var rabbitMqConnection = "host=192.168.1.23;virtualHost=/host;username=admin;password=123456";
Bus = RabbitHutch.CreateBus(rabbitMqConnection);
ITestSerivce serivce = new TestService();
Bus.Subscribe<TestEvent>(typeof(ITestSerivce).ToString(), serivce.HandleMessage);
Console.WriteLine("Listening for test message. Enter <exit> to quit.");
Console.Read();
}

可以看到代码简单很多,变成了一个纯粹的发送消息,处理消息,采用了事件总线的模式。

最新文章

  1. 为了体验 ILS 在Win2012R2 Hyper-V上安装Windows 2000 AdvSer
  2. tcp/ip http socket笔记
  3. Javascript之旅——第六站:看看writable特性
  4. 04JavaIO详解_DataInputStream(属于过滤l流)
  5. js的eval方法
  6. JavaWeb核心编程之(三.1)ServletHello
  7. Android五个布局
  8. nginx 实现Web应用程序的负载均衡
  9. BZOJ 3390: [Usaco2004 Dec]Bad Cowtractors牛的报复(最大生成树)
  10. window maven批量删除.lastUpdated文件
  11. [LeetCode] Print Binary Tree 打印二叉树
  12. Linux笔记2
  13. Java的SSH框架整合
  14. 采用config方式灵活配置我们的Quarz.net中的Job,Trigger
  15. 报Error creating bean with name &#39;dataSource&#39; defined in class path resource 报错解决办法
  16. 杨力第一次jjave作业
  17. 《Java性能调优》学习笔记(1)
  18. 【原创】Windows服务管家婆之Service Control Manager
  19. What are the differences between a pointer variable and a reference variable in C++?
  20. 目标检测--Scalable Object Detection using Deep Neural Networks(CVPR 2014)

热门文章

  1. TI BLE: Advertisement
  2. 如何截取iframe的内容,修改他的CSS
  3. 【148】DevExpress相关控件使用
  4. python自动化测试学习笔记-8单元测试unittest模块
  5. 自动生成 html5 小页面
  6. [JOI2014] 小笼包
  7. [TYVJ1391]走廊泼水节
  8. 【洛谷3345_BZOJ3924】[ZJOI2015]幻想乡战略游戏(点分树)
  9. lower_bound和upper_bound函数
  10. 392 Is Subsequence 判断子序列