基于C#的RabbitMQ consumer测试用例
1. Client安装
C#中开发相应的应用,需要RabbitMQ.Client, 由于在不同的.netcore 和.netframe的支持下,需要的控件版本不一样,需要基于系统安装的基础环境进行相应的选择,比如我使用的Visual Studio 2015,不支持V6.2.4,通过查询,安装的为V5.0.0.
相应版本的支持环境要求可通过如下链接查询。
https://www.nuget.org/packages/RabbitMQ.Client
通过NuGet terminal的安装可以通过选择正群版本后的指令拷贝后执行。
Install-Package RabbitMQ.Client -Version 5.2.0
2.程序开发
在进行RabbitMQ通信时,需要进行如下操作。
- 系统需要通过connection建立连接,在建立连接时刻,如下参数需要提供
HostName - 主机IP
Port - 端口号
UserName- 用户名
Password - 密码 - 需要进行Exchange, Queue, Routingkey的配置
- 建立相应的consumer
- 建立通道
具体的代码如下:
var factory = new ConnectionFactory();
factory.HostName = "10.10.10.11";//主机名,Rabbit会拿这个IP生成一个endpoint,这个很熟悉吧,就是socket绑定的那个终结点。
factory.Port = 5672; //端口号,RabbitMQ默认为5672
factory.UserName = "admin";//默认用户名,用户可以在服务端自定义创建,有相关命令行
factory.Password = "admin";//默认密码
using (var connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
channel.ExchangeDeclare(exchange: "test.topic", type: "topic", durable: true);
var queueName = channel.QueueDeclare(queue: "1111", durable: true, autoDelete: false, exclusive: false);
channel.QueueBind(queue: queueName,
exchange: "misplus.topic",
routingKey: "test.#");
/* 这里定义了一个消费者,用于消费服务器接受的消息
* C#开发需要注意下这里,在一些非面向对象和面向对象比较差的语言中,是非常重视这种设计模式的。
* 比如RabbitMQ使用了生产者与消费者模式,然后很多相关的使用文章都在拿这个生产者和消费者来表述。
* 但是,在C#里,生产者与消费者对我们而言,根本算不上一种设计模式,他就是一种最基础的代码编写规则。
* 所以,大家不要复杂的名词吓到,其实,并没那么复杂。
* 这里,其实就是定义一个EventingBasicConsumer类型的对象,然后该对象有个Received事件,
* 该事件会在服务接收到数据时触发。
*/
var consumer = new EventingBasicConsumer(channel);//消费者
channel.BasicConsume(queueName, true, consumer);//消费消息
consumer.Received += (model, ea) =>
{
var body = ea.Body;
//var message = Encoding.UTF8.GetString(body);
var code = Encoding.UTF7.GetString(body);
var message = Encoding.ASCII.GetString(body);
var routingKey = ea.RoutingKey;
Console.WriteLine(" [x] Received '{0}':'{1}'",
routingKey,
message);
};
for (int i = 0; i < 10000; i++)
{
channel.QueueDeclare(queue: "1111", durable: true, autoDelete: false, exclusive: false);
var properties = channel.CreateBasicProperties();
Thread.Sleep(3000);
}
}