走近消息队列之——MSMQ(.net)
一、普通队列:
string MQ_01 = ".\\Private$\\MQ_01"; //不存在队列时创建队列 if (!MessageQueue.Exists(MQ_01)) { MessageQueue.Create(MQ_01); } MessageQueue queue = new MessageQueue(MQ_01);//获取队列映射 queue.Formatter = new XmlMessageFormatter(new Type[] { typeof(String) });//告知读取信息采用的格式(使用该对象queue的映射,全部按这个格式读取信息) //发送信息 //举个例子:依次发10个消息 for (int i = 0; i < 10; i++) { Message msg = new Message(); msg.Label = $"label_{i}"; msg.Body = $"body_{i}"; queue.Send(msg); Console.WriteLine($"消息发送成功-Label:{msg.Label},body:{msg.Body}"); } //接收信息 //全部接收 while (queue.GetAllMessages().Count() > 0) { var receiveMsg = queue.Receive(); Console.WriteLine($"消息读取成功-Label:{receiveMsg.Label},body:{receiveMsg.Body}"); }
二、事务队列:
string MQ_02 = ".\\Private$\\MQ_02"; //不存在队列时创建队列 if (!MessageQueue.Exists(MQ_02)) { MessageQueue.Create(MQ_02, true);//开启了事务(1.电脑关机信息不丢失,2.发送&接收可以事务性操作); } MessageQueue queue = new MessageQueue(MQ_02);//获取队列映射 queue.Formatter = new XmlMessageFormatter(new Type[] { typeof(String) });//告知读取信息采用的格式(使用该对象queue的映射,全部按这个格式读取信息) //事务发送信息(要么全部发送成功,要么全部发送失败) //举个例子:依次发10个消息 if (queue.Transactional) { MessageQueueTransaction myTransaction = new MessageQueueTransaction(); myTransaction.Begin(); for (int i = 0; i < 10; i++) { Message msg = new Message(); msg.Label = $"label_{i}"; msg.Body = $"body_{i}"; queue.Send(msg, myTransaction); Console.WriteLine($"消息发送成功-Label:{msg.Label},body:{msg.Body}"); } myTransaction.Commit(); } //事务接收信息(要么全部接收成功,要么全部接收失败) //全部接收 if (queue.Transactional) { MessageQueueTransaction myTransaction1 = new MessageQueueTransaction(); myTransaction1.Begin(); while (queue.GetAllMessages().Count()>0) { var receiveMsg = queue.Receive(myTransaction1); Console.WriteLine($"消息读取成功-Label:{receiveMsg.Label},body:{receiveMsg.Body}"); } myTransaction1.Commit(); }
三、远程队列:
注意:不能跨服务器创建消息队列,只能服务器自行创建
如果使用一下代码会报错:
//不存在队列时创建队列 if (!MessageQueue.Exists(MQ_02)) { MessageQueue.Create(MQ_02, true);//开启了事务(1.电脑关机信息不丢失,2.发送&接收可以事务性操作); }
本地不能去判断服务器的队列是否存在,也不能创建服务器的队列。
正确方式:
1.在服务器,我的电脑右键管理,后的消息队列里,右键创建一个专用队列:“MQ_03”
2.设置队列属性
本地代码,发送消息到远端服务器的队列里去:
string MQ_03 = @"FormatName:Direct=TCP:150.107.3.190\private$\MQ_03"; MessageQueue queue = new MessageQueue(MQ_03);//获取队列映射 queue.Formatter = new XmlMessageFormatter(new Type[] { typeof(String) });//告知读取信息采用的格式(使用该对象queue的映射,全部按这个格式读取信息) //发送信息 //举个例子:依次发10个消息 for (int i = 0; i < 10; i++) { Message msg = new Message(); msg.Label = $"label_{i}"; msg.Body = $"body_{i}"; msg.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });// 选择xml的方式进行传送消息 queue.Send(msg); Console.WriteLine($"消息发送成功-Label:{msg.Label},body:{msg.Body}"); } //接收信息(接收会报错,原因:服务器的消息队列,只能服务器本地接收。) //所以,一般情况是,我们把消息发送到服务器队列,服务器里部署自己的程序去读取队列的信息后处理业务。 //若要做到以下代码能执行,也就是跨服务器读取队列信息时,就要修改服务器注册表,允许服务器的队列可被远程读取信息。 //全部接收 //while (queue.GetAllMessages().Length > 0) //{ // var receiveMsg = queue.Receive(); // Console.WriteLine($"消息读取成功-Label:{receiveMsg.Label},body:{receiveMsg.Body}"); //}
跨服务器读取队列信息时,就要修改服务器注册表,允许服务器的队列可被远程读取信息。可参考:
https://www.cnblogs.com/minily/p/7397746.html