C#应用消息队列异步处理数据存储
2012-04-19 18:43
501 查看
消息队列”是 Microsoft 的消息处理技术,它在任何安装了 Microsoft Windows 的计算机组合中,为任何应用程序提供消息处理和消息队列功能,无论这些计算机是否在同一个网络上或者是否同时联机。 “消息队列网络”是能够相互间来回发送消息的任何一组计算机。网络中的不同计算机在确保消息顺利处理的过程中扮演不同的角色。它们中有些提供路由信息以确定如何发送消息,有些保存整个网络的重要信息,而有些只是发送和接收消息。 “消息队列”安装期间,管理员确定哪些服务器可以互相通信,并设置特定服务器的特殊角色。构成此“消息队列”网络的计算机称为“站点”,它们之间通过“站点链接”相互连接。每个站点链接都有一个关联的“开销”,它由管理员确定,指示了经过此站点链接传递消息的频率。 利用消息队列可以很好的异步来出来数据传送和存储,当你频繁的向数据库中插入时,就可采取消息队列来异步向数据库中插入数据。向将要插入的数据发送到指 定的消息队列中,在有后台将消息读取插入到数据库中,在Pet Shop4.0中接订单的操作就是利用消息队列,先将接下的订单插入到消息队列中就立即返回,由后台接收消息插入订单。 下面是两个小程序,分别用来向消息队列中写入消息和向消息队列中读取消息。界面如下: 我是在VS2005中实现的,首先要添加System.Messaging.dll的引用: 主要代码: //1 创建消息队列 private void btnCreate_Click(object sender, EventArgs e) { String Path = txtPath.Text; try { this.Cursor = Cursors.WaitCursor; //判断队列是否存在,不存在就创建 EnsureQueueExists(Path); MyQueue = new System.Messaging.MessageQueue(Path,true); this.listView1.Items.Clear(); tssl.Text = "创建成功!"; } catch (MessageQueueException ex) { MessageBox.Show(ex.Message); } finally { this.Cursor = Cursors.Default; } } EnsureQueueExists方法 /**//// 检查队列,如果队列不存在,则建立 /// /// 队列名称 private static void EnsureQueueExists(string path) { if (!System.Messaging.MessageQueue.Exists(path)) { if (!System.Messaging.MessageQueue.Exists(path)) { System.Messaging .MessageQueue.Create(path,false); System.Messaging.MessageQueue mqTemp = new System.Messaging.MessageQueue(path); mqTemp.SetPermissions("Everyone", System.Messaging.MessageQueueAccessRights.FullControl); //mqTemp.Label = "MMM"; } } } 发送消息 //发送消息 private void btnSend_Click(object sender, EventArgs e) { MessageQueueTransaction myTransaction= new MessageQueueTransaction();; try { if (MyQueue == null) { return; } //Order为一个类对象,有两个对象:消息和发送的时间 Model.Order order = new Model.Order(); order.Message = txtMessage.Text; order.SendTime = DateTime.Now; //加入事务,前提条件是该消息队列在创建时支持事务 myTransaction.Begin(); //发送 MyQueue.Send(order); myTransaction.Commit(); InsertListView(order); } catch (MessageQueueException ex) { //myTransaction.Abort(); MessageBox.Show(ex.Message); } }接受消息端: private void btnListen_Click(object sender, EventArgs e) { try { string Path = txtPath.Text.Trim (); if (!System.Messaging.MessageQueue.Exists(Path)) { MessageBox.Show("该消息队列不存在"); txtPath.SelectAll(); return; } this.listView1.Items.Clear(); System.Messaging.MessageQueue MyQueue = new System.Messaging.MessageQueue(Path); //这句很重要,序列化接受到的消息数据,否则不知道接收到的数据,我发送的数据类型为Order,所以此也为 MyQueue .Formatter =new XmlMessageFormatter (new Type []{typeof (Model .Order)}); MyQueue.ReceiveCompleted += new ReceiveCompletedEventHandler(MyReceiveCompleted); MyQueue.BeginReceive(); } catch (MessageQueueException ex) { MessageBox.Show(ex.Message); } } 异步接收消息 private void MyReceiveCompleted(Object source, ReceiveCompletedEventArgs asyncResult) { try { MessageQueue mq = (MessageQueue)source; System.Messaging .Message ms = mq.EndReceive(asyncResult.AsyncResult); listView1.Invoke(new EventHandler(Event), new object[] { ms.Body, EventArgs.Empty }); mq.BeginReceive(); } catch(MessageQueueException ex) { MessageBox.Show(ex.Message); } return; } private void Event(object o, EventArgs e) { InsertListView((Model .Order )o); } private void InsertListView(Model.Order Obj) { ListViewItem Item = new ListViewItem(); Item.Text = Obj.Message; Item.SubItems.Add(Obj.SendTime.ToString ()); this.listView1.Items.Insert(0,Item); } } |
相关文章推荐
- 应用消息队列异步处理数据存储
- C# 模拟一个处理消息队列的线程类 Message Queue
- 基于消息机制的异步架构之对消息队列的处理
- C#网络Socket的数据发送与接收处理(利用异步)的模板(模式)
- ActiveMQ消息队列的应用 C#客户端 Web后端
- 文本数据处理—结合mysql模拟实现消息队列
- Android消息队列(二)--异步消息处理
- PHP消息队列实现及应用:队列处理订单系统和配送系统
- 用消息发送队列提高网络应用处理效率
- C#网络Socket的数据发送与接收处理(利用异步)的模板(模式)
- C# Application.DoEvents() 处理队列消息,防界面假死。
- C#开发微信门户及应用(2)--微信消息的处理和应答
- [置顶] Redis应用3-基于Redis消息队列实现的异步操作
- 一共81个,开源大数据处理工具汇总:查询引擎、流式计算、迭代计算、离线计算、键值存储、表格存储、文件存储、资源管理、日志收集系统、消息系统、分布式服务、集群管理、基础设施、搜索引擎、数据挖掘=监控
- C#实现异步消息队列
- C#多线程处理多个队列的数据
- 基于消息队列和消息应用状态处理分布式事务
- c# .net windows消息队列简单应用示例
- C#开发微信门户及应用(2) 微信消息处理和应答
- 【手机网络游戏 编程】C#异步socketAPI调用 处理数据的流程