本篇将介绍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();
}

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

RabbitMq的简单使用的更多相关文章

  1. rabbitmq的简单介绍一

    该博客的主要讲解了以下几种rabbitmq的用法1.实现简单的生产者发送消息给消费者2.实现序列持久化3.实现消息持久化4.实现消息公平分发5.实现广播6.实现组播7.实现细分组播 先来看下rabbi ...

  2. java操作rabbitmq实现简单的消息发送(socket编程的升级)

    准备: 1.下载rabbitmq并搭建环境(和python那篇一样:http://www.cnblogs.com/g177w/p/8176797.html) 2.下载支持的jar包(http://re ...

  3. RabbitMQ的简单封装

    一般在工作中,都是直接使用已经封装好的mq的程序集进行功能开发.所以很多时候都没有去了解rabbitmq到底是如何封装(实现使用的).所以心血来潮,简单记录下自己对rabbitmq的简单封装 整体的思 ...

  4. 关于RabbitMQ的简单理解

    说明:想要理解RabbitMQ,需要先理解MQ是什么?能做什么?然后根据基础知识去理解RabbitMQ是什么.提供了什么功能. 一.MQ的简单理解 1. 什么是MQ? 消息队列(Message Que ...

  5. RabbitMq(2) 简单消息队列

    <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client </ar ...

  6. RabbitMq 之简单队列

    简单队列类似于我们的生产者,消费者, 一个生产者,对应一个消费者. 直接上代码: package com.j1.rabbitmq.simple; import com.j1.rabbitmq.util ...

  7. rabbitMQ的简单实例——amqp协议带数据回写机制

    rabbitMQ是一种高性能的消息队列,支持或者说它实现了AMQP协议(advanced message queue protocol高级消息队列协议). 下面简单讲一讲一个小例子.我们首先要部署好r ...

  8. RabbitMQ (二) 简单队列

    参考:https://blog.csdn.net/vbirdbest/article/details/78583480 简单队列的模型: P : 生产者,即 Producer C : 消费者,即 Co ...

  9. RabbitMQ安装&简单使用

    .什么是RabbitMQ.详见 http://www.rabbitmq.com/. 作用就是提高系统的并发性,将一些不需要及时响应客户端且占用较多资源的操作,放入队列,再由另外一个线程,去异步处理这些 ...

随机推荐

  1. 人脸识别(初学篇)-VS2015+opencv3.2的配置

    初学人脸识别,感觉安装也是一个很大的麻烦. 写在这里记录一下吧 一:先安装好我们需要的软件 首先安装Vs2015,在官网或者csdn搜一下应该找的到. 安装步骤没有太多讲究. 点击exe文件,我选择的 ...

  2. P1266 速度限制(分层图spfa)

    P1266 速度限制 题目描述 在这个繁忙的社会中,我们往往不再去选择最短的道路,而是选择最快的路线.开车时每条道路的限速成为最关键的问题.不幸的是,有一些限速的标志丢失了,因此你无法得知应该开多快. ...

  3. SQL 设置登录名和密码

    1.打开SQL Server Manager管理器,在左面找到 ‘安全性’ 单击右键 选择‘新建”->“登录”, 如下图 2.弹出对话框,在登录名中输入你的登录号,选择'SQLSERVER身份验 ...

  4. 洛谷P3383 【模板】线性筛素数 (埃拉托斯特尼筛法)

    题目描述 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 输入输出格式 输入格式: 第一行包含两个正整数N.M,分别表示查询的范围和查询的个数. 接下来M行每行 ...

  5. python自动化学习笔记11-自动化测试UTP框架

    前面基本的unittest及ddt已经学过了,现在我们系统把这些知识结合起来,写一个简单的UTP自动化测试框架: 我们先来建基础目录,首先新建一个项目,项目下建父目录UTP,conf目录,用来存放配置 ...

  6. python orm / 表与model相互转换

    orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的,为了保证一致的 ...

  7. [转]C语言文件操作函数大全(超详细)

    fopen(打开文件)相关函数 open,fclose表头文件 #include<stdio.h>定义函数 FILE * fopen(const char * path,const cha ...

  8. Linux用户、用户组权限管理详解

    Linux用户管理三个重要文件详解: Linux登陆需要用户名.密码./etc/passwd 文件保存用户名.登录Linux时,Linux 先查找 /etc/passwd 文件中是否有这个用户名,没有 ...

  9. 【转】rpm包和源码包安装的区别

    转自:https://blog.csdn.net/junjie_6/article/details/59483785 建议在安装线上的生产服务器软件包时都用源码安装,这是因为源码安装可以自行调整编译参 ...

  10. PHP无符号右移与旋转右移

    # PHP 无符号右移 仅用于int形, PHP 的int为32位 # // 右移旋转 function rightRoate($int,$n){ $min = intval(PHP_INT_MAX ...