using RabbitMQ.Client;
namespace RabbitMQProject
{
public class MQHelper
{
public static ConnectionFactory GetSetting()
{
var factory = new ConnectionFactory()
{
HostName = "192.168.171.129",
Port = 5672,
UserName = "admin",
Password = "admin",
VirtualHost = "/"
};
return factory;
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using RabbitMQProject;
namespace Receive
{
public class TopicReceive
{
public static void ReceiveMessage()
{
var factory = MQHelper.GetSetting();
using (var connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
// 声明交换机对象
channel.ExchangeDeclare(exchange:"topic_exchange", // 交换机名称
type:"topic"); // 交换机类型
// 创建队列
var queueName1 = "topic_queue1";
channel.QueueDeclare(queue: queueName1,
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
var queueName2 = "topic_queue2";
channel.QueueDeclare(queue: queueName2,
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
var queueName3 = "topic_queue3";
channel.QueueDeclare(queue: queueName3,
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
// 绑定到交换机
channel.QueueBind(queue: queueName1,
exchange: "topic_exchange",
routingKey: "user.data.*");
channel.QueueBind(queue: queueName2,
exchange: "topic_exchange",
routingKey: "user.data.delete");
channel.QueueBind(queue: queueName3,
exchange: "topic_exchange",
routingKey: "user.data.update");
#region
//1. `durable`(持久化):如果将其设置为true,队列将会被持久化,即使RabbitMQ服务器在重启后也能够保持队列的持久化状态。如果设置为false,队列将是非持久化的,这意味着在RabbitMQ服务器重启后,队列将会被删除。
//2. `exclusive`(排他性):如果将其设置为true,队列将仅供声明它的连接使用,并且一旦连接关闭,队列将自动删除。这对于创建临时队列非常有用。如果将其设置为false,队列将是共享的,多个连接可以声明、使用和删除该队列。
//3. `autoDelete`(自动删除):如果将其设置为true,队列将会在不再使用时自动删除。当最后一个消费者从队列中取消订阅时,队列将被自动删除。如果将其设置为false,队列将不会自动删除,除非明确执行删除操作。
//4. `arguments`(参数):这个参数可以用来传递给队列的其他配置参数。您可以通过设置不同的参数值来定制队列的行为,例如设置消息的过期时间、最大长度等。在这个例子中,我们将其设置为`null`,表示没有其他的队列参数配置。
#endregion
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
var routingKey = ea.RoutingKey;
Console.WriteLine(" [x] Received '{0}' : '{1}'", routingKey, message);
};
channel.BasicConsume(queue: queueName3,
autoAck: true,
consumer: consumer);
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}
}
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using RabbitMQ.Client;
using RabbitMQProject;
namespace Send
{
internal class TopicSend
{
public static void SendMessage()
{
var factory = MQHelper.GetSetting();
using (var connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
// 声明交换机对象
channel.ExchangeDeclare("topic_exchange", "topic");
创建队列
//var queueName1 = "topic_queue1";
//channel.QueueDeclare(queue: queueName1,
// durable: false,
// exclusive: false,
// autoDelete: false,
// arguments: null);
//var queueName2 = "topic_queue2";
//channel.QueueDeclare(queue: queueName2,
// durable: false,
// exclusive: false,
// autoDelete: false,
// arguments: null);
//var queueName3 = "topic_queue3";
//channel.QueueDeclare(queue: queueName3,
// durable: false,
// exclusive: false,
// autoDelete: false,
// arguments: null);
绑定到交换机
//channel.QueueBind(queue: queueName1,
// exchange: "topic_exchange",
// routingKey: "user.data.*");
//channel.QueueBind(queue: queueName2,
// exchange: "topic_exchange",
// routingKey: "user.data.delete");
//channel.QueueBind(queue: queueName3,
// exchange: "topic_exchange",
// routingKey: "user.data.update");
for (int i = 0; i < 10; i++)
{
string message = $"RabbitMQ Topic {i + 1} Message";
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: "topic_exchange",
routingKey: "user.data.update",
basicProperties: null,
body: body);
Console.WriteLine("send topic {0} message", i + 1);
}
}
}
}
}
}