生产者
///
/// 交换机exchange通配符模式topic
///
///
public void SendrabbitmqExchangeTopic(IConnectionFactory connFactory, string msg, string exchangeName)
{
try
{
using (IConnection conn = connFactory.CreateConnection())
{
using (IModel channel = conn.CreateModel())
{
//路由名称
string routeKey = exchangeName;
channel.ExchangeDeclare(exchange: exchangeName, type: "topic", true);
//channel.ConfirmSelect();
//Console.WriteLine("消息内容:");
String message = msg;
//消息内容
byte[] body = Encoding.UTF8.GetBytes(message);
// 创建消息属性对象
var properties = channel.CreateBasicProperties();
// 设置自定义头部信息
properties.Headers = new Dictionary<string, object>
{
{ "destination", AppSettingsConstVars.SendHeaders },
};
//发送消息
channel.BasicPublish(exchange: exchangeName, routingKey: routeKey, basicProperties: properties, body: body);
//var isok = channel.WaitForConfirms();
Console.WriteLine("成功发送消息11:" + message + ";33");// + isok.ToString());
}
}
}
catch (Exception e)
{
throw;
}
}
消费者
///
/// 交换机exchange通配符模式topic
///
///
public async void ReceiverabbitmqExchangeTopic(IConnectionFactory connFactory, string exchangeName)
{
Console.WriteLine(“Start-exchange-topic”);
PoOrderResponseEventInfo? order = new PoOrderResponseEventInfo();
using (IConnection conn = connFactory.CreateConnection())
{
using (IModel channel = conn.CreateModel())
{
//消息队列名称
string queueName = exchangeName + “510";// “GRAVITY_DC_ICS_DESIGN_PO_ORDER_FAST_CREATE_OUTPUT_510”;
//string queueName = exchangeName + "” + new Random().Next(1, 1000).ToString();
//声明队列
channel.ExchangeDeclare(exchange: exchangeName, type: “topic”, true);
channel.QueueDeclare(
queue: queueName,// 消息队列名称
durable: true,//是否缓存
exclusive: false,
autoDelete: false,
arguments: null
);
// 创建消息属性对象
var headers = new Dictionary<string, object>();
headers.Add(“headers[‘destination’]”, AppSettingsConstVars.ReceiveHeaders);
//声明交换机
foreach (string routeKey in new string[] { “topic.*” })
{
//将队列与交换机进行绑定
//匹配多个路由
channel.QueueBind(queue: queueName, exchange: exchangeName, routingKey: “#”, arguments: headers);
}
//告诉Rabbit每次只能向消费者发送一条信息,再消费者未确认之前,不再向他发送信息
//声明为手动确认
channel.BasicQos(0, 5, false);
//创建消费者对象
var consumer = new EventingBasicConsumer(channel);
Console.WriteLine(“开始接收:” + queueName);
//接收消息
var sds = new BasicDeliverEventArgs();
PoOrderParamServices p = new PoOrderParamServices();
consumer.Received += (model, ea) =>
{
Thread.Sleep(1000);
byte[] message = ea.Body.ToArray();//接收的消息
var ss = Encoding.UTF8.GetString(message);
//吧读取出来的数据转为实体
order = JsonConvert.DeserializeObject(Encoding.UTF8.GetString(message), typeof(PoOrderResponseEventInfo)) as PoOrderResponseEventInfo;
if (order != null)
{
var data = _PoOrderParamServices.PoOrderResponseEvent(order);
}
Console.WriteLine(“接收到的消息为:” + Encoding.UTF8.GetString(message));
//返回消息确认
channel.BasicAck(ea.DeliveryTag, true);
};
//消费者开启监听
//将autoAck设置false 关闭自动确认
channel.BasicConsume(queue: queueName, autoAck: false, consumer: consumer);
Console.WriteLine(“消费者已启动,等待接收消息…”);
Console.ReadLine();
}
}