Asp.Net中的消息处理-MSMQ系列学习(1)

Asp.Net中的消息处理---MSMQ系列学习(一)

      刚刚毕业一年,比较浮躁,上次面试被问到消息队列,觉得非常的惭愧因为不知道,所以下定决心一定要学会使用它。以前只是听说过有这么个东西,要说是什么,在什么场景下使用却是无从知晓,因为自己也确实没有在项目中用过,毫无底气能够去和面试官谈论一番。好了现在就开始一步步学习吧!

    首先我们要知道消息队列是什么? 我是被网络上的解释忽悠的一愣一愣的,来个个人通俗的解释吧,消息队列顾名思义它首先得是个队列,队列的操作呢一班主要的也就是入队和出队,也就是你有一个程序在产生消息内容后(也就是你想发送的内容,比如一个字符串,一本书等等),也就是入队(即生产者),另一个程序呢读取消息队列,读出你发送进入的消息内容,这就是出队(消费者);那么这样的情况一般我们会在什么情况下去使用消息队列呢?总结大神的一句话:当你不需要立即获得结果,但是并发量又不能无限大的时候,差不多就是你需要使用消息队列的时候.比如你写日志的时候,一个客户端有多个操作区写日志,又有很多个客户端去写,显然并发不能无穷大,于是你就需要把写日志的请求放入消息队列中,在消费者那边依次取出队列的消息写入到日志里。

 

一.MSMQ的安装

    关于MSMQ的介绍我就不多说了,想知道的自己百度,http://www.oschina.net/translate/top-10-uses-for-message-queue

    具体的安装过程就是 控制面板->卸载程序->打开或者关闭Windows功能,选择MSMQ,如下图,点击确定即可;

  Asp.Net中的消息处理-MSMQ系列学习(1)

  Asp.Net中的消息处理-MSMQ系列学习(1)

 

  创建队列的方式如上,还有另外一种方式,通过代码编程来实现,在.NetFramework中国提供了MessageQueue类下的静态方法Crate(),来实现消息队列的创建,其定义如下

Asp.Net中的消息处理-MSMQ系列学习(1)Asp.Net中的消息处理-MSMQ系列学习(1)
 1 1//
 2 
 3  2// 摘要:
 4 
 5  3//    在指定的路径中创建非事务性“消息队列”队列。
 6 
 7  4//
 8 
 9  5// 参数:
10 
11  6//   path:
12 
13  7//     要创建的队列的路径。
14 
15  8//
16 
17  9// 返回结果:
18 
19 10//     表示新队列的 System.Messaging.MessageQueue。
20 
21 11public static MessageQueue Create(string path);
22 
23 12//
24 
25 13// 摘要:
26 
27 14//     在指定的路径中创建事务性或非事务性“消息队列”队列。
28 
29 15//
30 
31 16// 参数:
32 
33 17//   transactional:
34 
35 18//     如果创建事务性队列,为 true;如果创建非事务性队列,则为 false。
36 
37 19//
38 
39 20//   path:
40 
41 21//     要创建的队列的路径。
42 
43 22//
44 
45 23// 返回结果:
46 
47 24//     表示新队列的 System.Messaging.MessageQueue。
48 
49 25public static MessageQueue Create(string path, bool transactional);
View Code

 

二.创建,删除和管理队列

    在.Net平台下编写消息队列的程序,我们必须学习一个很重要的类MessageQueue,该类位于命名空间System.Messageing下,其中有几个常用的方法必须掌握:

---Create方法:创建使用指定路径的新消息队列

---Delete方法:删除现有的消息队列

---Existe方法:查看指定消息队列是否存在

---GetAllMessages()方法:得到队列中的所有消息

---Peek/BeginPeek方法:查看某个特定队列中的消息队列,但不从该队列中移出消息

---Receive/BeginReceive方法:检索指定消息队列中最前面的消息并将其从该队列中移除

---Send方法:发送消息到指定的消息队列

---Purge方法:清空指定队列的消息

 

三.发送和序列化消息

   MSMQ消息队列中定义的消息由一个主体和若干属性组成,消息的主体可以又文本,二进制构成,根据需要还可以考虑被加密,在MSMQ中消息的大小不能够超过4M。

1.发送消息步骤: 连接队列->指定消息格式->提供要发送的数据(主体)->调用send()方法将消息发送出去;

2.序列化消息:消息序列化可以通过.Net框架附带的三个预定义格式化程序来完成,

              XMLMessageFormatter,BinaryMessageFormatter,ActiveXMessageFormatter

3.消息发送实例

   现在有这样一个需求,要求通过消息队列将一本图书信息发送到队列里,然后从消息队列里读取出来。图书的基本信息包括图书编号、图书名称、图书作者以及图书定价,这样的一个复杂的对象类型怎么来传输呢?详细如下:

 传递对象

Asp.Net中的消息处理-MSMQ系列学习(1)Asp.Net中的消息处理-MSMQ系列学习(1)
using System;
using System.Collections.Generic;
using System.Text;

namespace MSMQ
{
    public class Book
    {
        public int BookId
        {
            get;
            set;
        }

        public string BookName
        {
            get;
            set;
        }

        public string BookAuthor
        {
            get;
            set;
        }

        public double BookPrice
        {
            get;
            set;
        }
    }
}
Book

 

 MSMQ操作

Asp.Net中的消息处理-MSMQ系列学习(1)Asp.Net中的消息处理-MSMQ系列学习(1)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Messaging;
using System.Windows.Forms;
namespace MSMQ
{
    class MSMQOperation
    {
          /// <summary>
        /// 通过Create方法创建使用指定路径的新消息队列
        /// </summary>
        /// <param name="queuePath"></param>
        public static void Createqueue(string queuePath)
        {
            try
            {
                if (!MessageQueue.Exists(queuePath))
                { 
                    MessageQueue.Create(@".\private$\myQueue");
                    MessageBox.Show("创建队列成功!");
                }
                   else
                {
                    MessageBox.Show(queuePath + "已经存在!");
                }
                    
            }
            catch (MessageQueueException e)
            { 
              MessageBox.Show(e.Message);
            }
        }

         /// <summary>
        /// 连接消息队列并发送消息到队列
        /// </summary>
        public static bool SendMessage(Book book)
        {
            bool flag = false;
            try
            {
                //连接到本地的队列
                MessageQueue myQueue = new MessageQueue(".\\private$\\myQueue");

                System.Messaging.Message myMessage = new System.Messaging.Message();
                myMessage.Body = book;
                myMessage.Formatter = new XmlMessageFormatter(new Type[] { typeof(Book) });
                //发送消息到队列中
                myQueue.Send(myMessage);
                flag = true;
            }
            catch (ArgumentException e)
            {
                MessageBox.Show(e.Message);
            }
            return flag;
        }

        public static string ReceiveMessage()
        {
            MessageQueue myqueue = new MessageQueue(@".\private$\myQueue");

            myqueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(Book) });
            try
            { 
              System.Messaging.Message myMessage=myqueue.Receive();
              Book book= myMessage.Body as Book;
              return string.Format("编号:{0},书名:{1},作者:{2},定价:{3}",
                    book.BookId,
                    book.BookName,
                    book.BookAuthor,
                    book.BookPrice);
            }
            catch (MessageQueueException e)
            {
                MessageBox.Show(e.Message);
            }
            catch (InvalidCastException e)
            {
                MessageBox.Show(e.Message);
            }
            return null;

        }
    }
}
MSMQOperation

Asp.Net中的消息处理-MSMQ系列学习(1)

这里简单的使用就介绍到这里了,后期想学习petshop,学习下单处理策略据说不错

1楼Supper_litt
就是进程间通信嘛,你文章的标题是asp.net.你有没有举例asp.net里面怎么用啊?还是说不能用?
Re: CraspLion
@Supper_litt,嗯,失误,说的对呢,我这是最近一步步想学MSMQ,标题改下哈