C#消息队列
一、Message Quenuing 5.0是windows Service 2008 R2和windows7的一部分。有4.0 ;3.0 ;2.0。
二、安装 控制面板, 程序,打开或关闭windows功能
三、guiden.exe创建类型ID是通用唯一的ID(UUID)或GUID;
四、Message类的Priority属性可以优先级。
读取消息队列时,默认情况下不读取消息的优先级,所以MessageQueue.MessageReadPropertyFilter.Priority = true;
五、Recoverable属性设置true使消息可以恢复。
六、因为默认情况下不读取消息的优先级,所以MessageReadPropertyFilter属性必须设置为接收Priority。(queue.MessageReadPropertyFilter.Priority=true)
View Code七、MessageQueue.Send(对象)使用默认的XmlMessageFormatter序列化它,再把它写入队列中。
orderQueue.Formatter = new XmlMessageFormatter( new Type[] { typeof(CourseOrder), typeof(Customer), typeof(Course) });
反序列化
CourseOrder order = message.Body as CourseOrder;
八、因为线程不能把文本写入列表框中Dispatcher.Invoke()方法把请求写入创建线程中
Dispatcher.Invoke(DispatcherPriority.Normal, new Action<LabelIdMapping>(AddListItem), labelId);
九、确认队列
1、Message.AdministrationQueue设置一个新的队列,把Message的AckowledgementType的属性设置为AcknowledgementTypes.FullReceive
2、如果把Message类的UseDeadLetterQueue设置为true,消息超时未到达目标队列时,该消息就会复制到死信队列中,TimeToReadchQueue和TimeToBeReceived设置超时时间。
3.响应队列
View Code
void MessageFormatter(Message message) { Message responseMessage = new Message("response"); responseMessage.CorrelationId =message.Id;// "原始消息的ID"; message.ResponseQueue.Send(responseMessage); }
十、事物队列
1、消息的到达顺序与其发生的顺序相同。
2、消息只到达一次
3、给MessageQueue.Create()方法的第二参数设置true就会创建事物消息队列。
4、发生消息队列的队列
View Code
void MessageTransaction() { if (!MessageQueue.Exists(@".\MyTransactionalQueue")) { MessageQueue.Create(@".\MyTransactionalQueue",true); } MessageQueue queue = new MessageQueue(@".\MyTransactionalQueue"); Message message = new Message(); message.Body = "创建消息队列事物"; var transaction = new MessageQueueTransaction(); try { transaction.Begin(); queue.Send(message, transaction); queue.Send("a", transaction); transaction.Commit(); } catch { transaction.Abort(); } }
View Code
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Messaging; namespace CreateMessageQueue { class Program { static void Main(string[] args) { #region 创建私有的队列消息 //你在创建公有队列,而你的机器不属于任何域。一般工作组安装的计算机只能创建私有队列。 //using (var queue = MessageQueue.Create(@".\Private$\MyNewPublicQueue")) //{ // queue.Label = "Demo Queue"; // Console.WriteLine("Queue created:"); // Console.WriteLine("地址{0}", queue.Path); // Console.WriteLine("FormatName:{0}", queue.FormatName); //} #endregion #region 查找本机所有的私有队列消息 //foreach (var queue in MessageQueue.GetPrivateQueuesByMachine(".")) //{ // Console.WriteLine(queue.Path); //} #endregion #region 发送消息队列 //if (MessageQueue.Exists(@".\Private$\MyNewPublicQueue")) //{ // var queue = new MessageQueue(@".\Private$\MyNewPublicQueue"); // //发送消息 // queue.Send("Sample Message","Label"); //} //else //{ // Console.WriteLine("找不到公共的消息队列"); //} #endregion #region 接收队列消息 //var queue = new MessageQueue(@".\Private$\MyNewPublicQueue"); //queue.Formatter = new XmlMessageFormatter(new string[] { "System.String" }); //Message message = queue.Receive(); //Console.WriteLine(message.Body); #endregion #region 时间间隔收取 //var queue = new MessageQueue(@".\Private$\MyNewPublicQueue"); //queue.Formatter = new XmlMessageFormatter(new string[] { "System.String" }); //using (MessageEnumerator messages = queue.GetMessageEnumerator2()) //{ // while (messages.MoveNext(TimeSpan.FromMinutes(30))) // { // Message message = messages.Current; // Console.WriteLine(message.Body); // } //} #endregion #region 异步收取消息队列 var queue = new MessageQueue(@".\Private$\MyNewPublicQueue"); queue.Formatter = new XmlMessageFormatter(new string[] { "System.String" }); queue.ReceiveCompleted += MessageArrived; queue.BeginReceive(); #endregion Console.ReadKey(); } public static void MessageArrived(object source, ReceiveCompletedEventArgs e) { MessageQueue queue = (MessageQueue)source; Message message = queue.EndReceive(e.AsyncResult); Console.WriteLine(message.Body); } /// <summary> /// 给队列发送复杂的消 /// </summary> /// <param name="queue"></param> void MessageFormatter(Message message) { Message responseMessage = new Message("response"); responseMessage.CorrelationId =message.Id;// "原始消息的ID"; message.ResponseQueue.Send(responseMessage); } void MessageTransaction() { if (!MessageQueue.Exists(@".\MyTransactionalQueue")) { MessageQueue.Create(@".\MyTransactionalQueue",true); } MessageQueue queue = new MessageQueue(@".\MyTransactionalQueue"); Message message = new Message(); message.Body = "创建消息队列事物"; var transaction = new MessageQueueTransaction(); try { transaction.Begin(); queue.Send(message, transaction); queue.Send("a", transaction); transaction.Commit(); } catch { transaction.Abort(); } } } }

浙公网安备 33010602011771号