C#使用MSMQ队列消息

概要

C#通过读取队列中数据截取自己想要的,通过队列来发送消息,XML文件格式传输来进行交互

获取数据可以同正则表达式来截取想要的数据

安装MSMQ

  1. 首先打开此地电脑,点击计算机打开卸载或更改程序
  2. 点击启用或关闭Windows功能,下载Microsoft消息队列

C#读取和写入Demo演示

  1. 搭建的小Demo
  2. Demo可以模拟客户服务器来发送消息,客户端自动接收信息和截取数据,可以进行发送
  3. 可以通过点击 1.此电脑右击打开管理 2.服务器和应用程序 3.消息队列中专用队列,来看队列消息和队列日志

C#代码分析

  1. 使用代码来创建队列
     MessageQueue queue;//服务器
     string path = ".\\Private$\\lps-to-tester";
    
     MessageQueue queueReceive;//本机
     string pathReceive = ".\\Private$\\tester-to-lps";
    
     public Form1()
     {
         InitializeComponent();
         logText = AddItem;
         
     }
    
     private void CreateMessageQueue()
     {
         if(MessageQueue.Exists(path))
         {
             queue = new MessageQueue(path);
         }
         else
         {
             queue = MessageQueue.Create(path);
         }
    
         if (MessageQueue.Exists(pathReceive))
         {
             queueReceive = new MessageQueue(pathReceive);
         }
         else
         {
             queueReceive = MessageQueue.Create(pathReceive);
         }
         AsyncReceiveMessage();//创建接收服务器函数
     }
  2. 绑定服务器回调函数
     public void AsyncReceiveMessage()
     {
         try
         {
             //这里使用了委托,当接收消息完成的时候就执行MyReceiveCompleted方法
             queue.ReceiveCompleted += new ReceiveCompletedEventHandler(MyReceiveCompleted);
             queue.Formatter = new XmlMessageFormatter(new Type[] { typeof(XmlNode) });
             queue.BeginReceive();//启动一个没有超时时限的异步操作
         }
         catch (Exception ex)
         {
             logText("MSMQ调用失败" + ex.Message);
         }
     }
    
     public void MyReceiveCompleted(object source, ReceiveCompletedEventArgs asyncResult)
     {
         try
         {
             
             MessageQueue mq = (MessageQueue)source;
             XmlDocument doc = new XmlDocument();
             doc.Load(asyncResult.Message.BodyStream);
             logText("接收" + doc.InnerXml);
             XmlDocument xml = ConvertStringToXmlDocument(doc.InnerXml.ToString());
             XmlNode node = xml.SelectSingleNode("request");
             foreach (XmlNode xmlNode in node.ChildNodes)
             {
                 value = xmlNode.Attributes["bsn"].Value;
                 value1 = xmlNode.Attributes["barcode"].Value;
                 break;
             }
             textBox2.Text = value;
             textBox3.Text = value1; 
             mq.BeginReceive();
         }
         catch (MessageQueueException ex)
         {
             logText("MSMQ接收消息失败");
         }
         logText("MSMQ接收成功");
     }
  3. 模拟服务器发送函数
      private void SendMessage()
      {
    
          try
          {
              XmlDocument xml = new XmlDocument();
              //创建XML声明对象 
              XmlDeclaration xmlDeclaration = xml.CreateXmlDeclaration("1.0", "UTF-8", null);
              //将声明对象添加到XML文档
              xml.AppendChild(xmlDeclaration);
    
              XmlElement xmlStudents = xml.CreateElement("request");
              xml.AppendChild(xmlStudents);
              XmlElement xmlStu = xml.CreateElement("job");
    
              xmlStu.SetAttribute("bsn", "123");
              xmlStu.SetAttribute("barcode", "LH");
              xmlStudents.AppendChild(xmlStu);
    
              System.Messaging.Message message = new System.Messaging.Message();
              message.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
              message.Body = xml;
              queue.Send(message);
          }
          catch (Exception ex)
          {
             logText("Msmq发送失败" + ex.Message);
              return;
          }
          logText("服务器发送成功");
      }
  4. 客户端发送
    private void button3_Click(object sender, EventArgs e)
    {
        try
        {
            XmlDocument xml = new XmlDocument();
            //创建XML声明对象 
            XmlDeclaration xmlDeclaration = xml.CreateXmlDeclaration("1.0", "UTF-8", null);
            //将声明对象添加到XML文档
            xml.AppendChild(xmlDeclaration);
    
            XmlElement xmlStudents = xml.CreateElement("result");
            xml.AppendChild(xmlStudents);
            XmlElement xmlStu = xml.CreateElement("job");
            xmlStu.SetAttribute("bsn",  textBox2.Text);
            xmlStu.SetAttribute("result", this.textBox1.Text);
            xmlStu.SetAttribute("barcode", textBox3.Text);
            xmlStudents.AppendChild(xmlStu);
    
            System.Messaging.Message message = new System.Messaging.Message();
            message.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
            logText(xml.InnerXml);
            message.Body = xml;
            queueReceive.Send(message);
        }
        catch (Exception ex)
        {
            logText("客户端"+ex.Message);
            return;
        }
        logText("客户端发送成功");
    }

小结

队列(Queue)是一种先进先出(FIFO)的数据结构。这意味着最先进入队列的元素会最先被移除,而最后进入队列的元素会最后被移除。队列通常具有两个基本操作:入队(enqueue),将元素添加到队列的末尾;出队(dequeue),从队列的头部移除元素。这种结构类似于排队等候服务的情况,先到先得。

  • 15
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值