RabbitMQ .NET消息队列使用详解

本文实例为大家分享了RabbitMQ .NET消息队列使用方法,供大家参考,具体内容如下

首先下载安装包,我都环境是win7 64位:

去官网下载 otp_win64_19.0.exe  和rabbitmq-server-3.6.3.exe安装好

然后开始编程了:

(1)创建生产者类:

class Program

{

private static void Main()

{

//建立RabbitMQ连接和通道

var connectionFactory = new ConnectionFactory

{

HostName = "127.0.0.1",

Port = 5672,

UserName = "guest",

Password = "guest",

Protocol = Protocols.DefaultProtocol,

AutomaticRecoveryEnabled = true, //自动重连

RequestedFrameMax = UInt32.MaxValue,

RequestedHeartbeat = UInt16.MaxValue //心跳超时时间

};

try

{

using (var connection = connectionFactory.CreateConnection())

{

using (var channel = connection.CreateModel())

{

//创建一个新的,持久的交换区

channel.ExchangeDeclare("SISOExchange", ExchangeType.Direct, true, false, null);

//创建一个新的,持久的队列, 没有排他性,与不自动删除

channel.QueueDeclare("SISOqueue", true, false, false, null);

// 绑定队列到交换区

channel.QueueBind("SISOqueue", "SISOExchange", "optionalRoutingKey");

// 设置消息属性

var properties = channel.CreateBasicProperties();

properties.DeliveryMode = 2; //消息是持久的,存在并不会受服务器重启影响

//准备开始推送

//发布的消息可以是任何一个(可以被序列化的)字节数组,如序列化对象,一个实体的ID,或只是一个字符串

var encoding = new UTF8Encoding();

for (var i = 0; i < 10; i++)

{

var msg = string.Format("这是消息 #{0}?", i + 1);

var msgBytes = encoding.GetBytes(msg);

//RabbitMQ消息模型的核心思想就是,生产者不把消息直接发送给队列。实际上,生产者在很多情况下都不知道消息是否会被发送到一个队列中。取而代之的是,生产者将消息发送到交换区。交换区是一个非常简单的东西,它一端接受生产者的消息,另一端将他们推送到队列中。交换区必须要明确的指导如何处理它接受到的消息。是放到一个队列中,还是放到多个队列中,亦或是被丢弃。这些规则可以通过交换区的类型来定义。

//可用的交换区类型有:direct,topic,headers,fanout。

//Exchange:用于接收消息生产者发送的消息,有三种类型的exchange:direct, fanout,topic,不同类型实现了不同的路由算法;

//RoutingKey:是RabbitMQ实现路由分发到各个队列的规则,并结合Binging提供于Exchange使用将消息推送入队列;

//Queue:是消息队列,可以根据需要定义多个队列,设置队列的属性,比如:消息移除、消息缓存、回调机制等设置,实现与Consumer通信;

channel.BasicPublish("SISOExchange", "optionalRoutingKey", properties, msgBytes);

}

channel.Close();

}

}

}

catch (Exception ex)

{

Console.WriteLine(ex.Message);

}

Console.WriteLine("消息发布!");

Console.ReadKey(true);

}

}

(1)创建消费者类:

class Program

{

private static void Main()

{

// 建立RabbitMQ连接和通道

var connectionFactory = new ConnectionFactory

{

HostName = "127.0.0.1",

Port = 5672,

UserName = "guest",

Password = "guest",

Protocol = Protocols.AMQP_0_9_1,

RequestedFrameMax = UInt32.MaxValue,

RequestedHeartbeat = UInt16.MaxValue

};

using (var connection = connectionFactory.CreateConnection())

using (var channel = connection.CreateModel())

{

// 这指示通道不预取超过1个消息

channel.BasicQos(0, 1, false);

//创建一个新的,持久的交换区

channel.ExchangeDeclare("SISOExchange", ExchangeType.Direct, true, false, null);

//创建一个新的,持久的队列

channel.QueueDeclare("sample-queue", true, false, false, null);

//绑定队列到交换区

channel.QueueBind("SISOqueue", "SISOExchange", "optionalRoutingKey");

using (var subscription = new Subscription(channel, "SISOqueue", false))

{

Console.WriteLine("等待消息...");

var encoding = new UTF8Encoding();

while (channel.IsOpen)

{

BasicDeliverEventArgs eventArgs;

var success = subscription.Next(2000, out eventArgs);

if (success == false) continue;

var msgBytes = eventArgs.Body;

var message = encoding.GetString(msgBytes);

Console.WriteLine(message);

channel.BasicAck(eventArgs.DeliveryTag, false);

}

}

}

}

}

消费者--结果如图:

以上是 RabbitMQ .NET消息队列使用详解 的全部内容, 来源链接: utcz.com/z/325227.html

回到顶部