消息队列实现数据同步

来源:互联网 发布:linux 抓取log日志 编辑:程序博客网 时间:2024/06/06 01:02
应用场景&优势:
  • 异步传输、效率高
  • Redis解决高并发问题
  • 不受限于网络连接(网络中断)
  • 进程死锁(服务器放弃队列中的过期死操作)
  • 数据同步
与SyncFramework比较:
  • SyncFramework 是微软框架,支持离线文件式数据库SqlCE与SqlServer/Oracle的数据同步,要求表结构完全一致,是数据级别同步,与业务无关。只能单线程同步,同步分组只有在数据同步后才知晓有无数据同步、有多少上行/下行同步数据,有不可控因素,实时效率不高,开发代码少。
  • MSMQ消息队列,需要入队出队的任一方安装MSMQ,数据传递稳定、时效性高,业务逻辑需要手写代码处理(消息队列的创建、发送、接收)、数据库不限,灵活性高。
  • 不过MSMQ 判断队列是否存在的等方法都是不支持远程机器的
工作中使用场景:
移动药车APP,网络环境不稳定,需要偶尔的离线时正常使用,所以,存在离线数据库和服务器数据库,这样就需要在网络好的情况下进行数据同步。要求时效性高、传输稳定、有日志追踪。
专用队列:
消息队列:是在消息传输过程中保存消息的容器。
MSMQ是Microsoft的消息处理技术,运行平台为Microsoft Windows操作系统。
它分为用户队列和系统队列。
在用户队列中又分为专用队列:不在整个网络中发布,仅在所驻留的本地计算机上可用。专用队列只能由知道队列的完整路径名或标签的用户程序访问。
架构方案(图):

程序Demo:
分为客户端1和客户端2两部分,客户端1发送消息给客户端2,客户端2接收本地消息队列并显示出来。
发送:
System.Messaging.MessageQueue queue=new System.Messaging.MessageQueue("FormatName:Direct=OS:Client01-PC\\private$\\queue");//System.Messaging.MessageQueue queue=new System.Messaging.MessageQueue(".\\Private$\\queue");// Create messageSystem.Messaging.Message message=new System.Messaging.Message();message.Body=textBox1.Text.Trim();message.Formatter=new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) });// Put message into queuequeue.Send(message);
接收:
// Receive message, 同步的Receive方法阻塞当前执行线程,直到一个message可以得到System.Messaging.Message message = queue.Receive();message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) });textBox2.Text += message.Body.ToString();
或者
queue.ReceiveCompleted += new ReceiveCompletedEventHandler(messageQueue_ReceiveCompleted);queue.BeginReceive();this.button2.Enabled = false;
delegate void SetTextCallback(string text);private void SetText(string text){  if (this.textBox2.InvokeRequired)  {   while (!this.textBox2.IsHandleCreated)     {//解决窗体关闭时出现“访问已释放句柄“的异常      if (this.textBox2.Disposing || this.textBox2.IsDisposed)  return;      SetTextCallback d = new SetTextCallback(SetText);      this.textBox2.Invoke(d, new object[] { text });     }}else this.textBox2.Text += text;}private void messageQueue_ReceiveCompleted (object sender, ReceiveCompletedEventArgs e){try{  MessageQueue mq=sender as MessageQueue;  if(null!=mq)  {    System.Messaging.Message message = mq.EndReceive(e.AsyncResult);    message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) });    var appendString= message.Body.ToString();    this.SetText(appendString);    mq.BeginReceive();   }}catch(Exception ex){}}  

注意:发送和接收时,都需要队列给足权限,队列最好存在与否先判断。
推荐资料:
http://www.lanhusoft.com/Article/17.html
http://www.cnblogs.com/yjmyzz/archive/2007/12/04/982440.html
http://www.cnblogs.com/mq0036/p/3560783.html
Demo下载地址:




0 0
原创粉丝点击