1、关于引用
针对RabbitMQ.Client 6.8.1
2、基类
public class RabbitMqHelper
{
public static string HostName = "127.0.0.1";//服务端IP地址
public static int PortNum = 5672;//服务端监听的端口号
public static string UserName = "guest";
public static string Password = "guest";
public static string VirtualHost = "saas";
/// <summary>
/// 创建连接
/// </summary>
/// <returns></returns>
public IConnection GetConnection()
{
try
{
var factory = new ConnectionFactory()
{
HostName = HostName,
Port = PortNum,
UserName = UserName,
Password = Password,
VirtualHost = VirtualHost
};
var conn = factory.CreateConnection();
return conn;
}
catch (Exception ex)
{
throw ex;
}
}
}
2、发布信息
public class RabbmitMqSendHelper : RabbitMqHelper
{
/// <summary>
/// 发送消息
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
public bool SendMsg(Hashtable hashtable)
{
try
{
using (var conn = GetConnection())
{
using (var channel = conn.CreateModel())
{
//声明交换机
string exchangeName = hashtable["topic"].ToString();
channel.ExchangeDeclare(exchangeName, ExchangeType.Direct, true, false, null);
//声明队列
string queueName = hashtable["routingKey"].ToString();
channel.QueueDeclare(queue: queueName,
durable: true,
exclusive: false,
autoDelete: false,
arguments: null);
//队列绑定交换机
channel.QueueBind(queueName, exchangeName, routingKey: queueName);
string msg = JsonHelper.SerializeObject(hashtable);
//发送数据
var body = Encoding.UTF8.GetBytes(msg);
channel.BasicPublish(exchange: exchangeName,
routingKey: queueName,
basicProperties: null,
body: body);
};
};
return true;
}
catch (Exception ex)
{
throw ex;
}
}
}
3、信息订阅
/// <summary>
/// 扇形交换机接收消息
/// </summary>
public class RabbitMqFanoutReceiveHelper : RabbitMqHelper
{
public RabbitMqReceiveEventHandler OnReceiveEvent;
private IConnection conn;
private IModel channel;
private EventingBasicConsumer consumer;
public bool StartReceiveMsg(string exchange,string queueName)
{
try
{
using (var conn = GetConnection())
{
using (var channel = conn.CreateModel())
{
channel.ExchangeDeclare(exchange: exchange, type: ExchangeType.Fanout,durable:true);
//此处随机取出交换机下的队列
//var queueName = channel.QueueDeclare().QueueName;
channel.QueueBind(queue: queueName, exchange: exchange, routingKey: "");
consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
//Console.WriteLine(" [x] Received {0}", message);
if (OnReceiveEvent != null)
{
OnReceiveEvent(queueName+"::"+message);
}
};
channel.BasicConsume(queue: queueName,
autoAck: true,
consumer: consumer);
};
};
return true;
}
catch (Exception ex)
{
throw ex;
}
}
}
4、主程序初始化
private RabbmitMqSendHelper helper = null;
/// <summary>
/// 初始化MQ
/// </summary>
private void InitMQ()
{
if (string.IsNullOrEmpty(DAL.LoginSession.RabbitMQConfig.MqIP))
{
MQIP = "请配置MQ";
return;
}
ClassLib.RabbitMqHelper.HostName = DAL.LoginSession.RabbitMQConfig.MqIP;
if (string.IsNullOrEmpty(DAL.LoginSession.RabbitMQConfig.MqPort))
{
MQIP = "请配置MQ";
return;
}
ClassLib.RabbitMqHelper.PortNum = Convert.ToInt32(DAL.LoginSession.RabbitMQConfig.MqPort);
if (string.IsNullOrEmpty(DAL.LoginSession.RabbitMQConfig.MqUser))
{
MQIP = "请配置MQ";
return;
}
ClassLib.RabbitMqHelper.UserName = DAL.LoginSession.RabbitMQConfig.MqUser;
if (string.IsNullOrEmpty(DAL.LoginSession.RabbitMQConfig.MqPassWord))
{
MQIP = "请配置MQ";
return;
}
ClassLib.RabbitMqHelper.Password = DAL.LoginSession.RabbitMQConfig.MqPassWord;
if (string.IsNullOrEmpty(DAL.LoginSession.RabbitMQConfig.MqVirtualHost))
{
MQIP = "请配置MQ";
return;
}
ClassLib.RabbitMqHelper.VirtualHost = DAL.LoginSession.RabbitMQConfig.MqVirtualHost;
MQIP = DAL.LoginSession.RabbitMQConfig.MqIP;
helper = new ClassLib.RabbmitMqSendHelper();
}
5、发送数据
if (helper != null)
{
var dInfo = shopTagPrintInfoModels?.Where(o => o.num == dcode).FirstOrDefault();
Hashtable parm = new Hashtable();
parm.Add("tenantId", DAL.LoginSession.UserData.tenant_id);
parm.Add("epc", tag);
parm.Add("collectionDeviceNum", dcode);
parm.Add("collectionDeviceIp", tagInfo.IP);
parm.Add("collectionDeviceMac", dInfo?.mac);
parm.Add("place", dInfo?.place);
parm.Add("collectionTime", CoventTime(time));
parm.Add("reportingTime", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
Hashtable hashtable = new Hashtable();
hashtable.Add("routingKey", "archive.queue.commonEvent");
hashtable.Add("topic", "archive.directExchange");
hashtable.Add("payload", parm);
helper.SendMsg(hashtable);
}