Message Queue基本使用说明

一、安装Message Queue:

在Win7之前,控制面板,添加删除组件(Windows Message Queue)。

Win7~Win8:控制面板,程序和功能,启用或关闭Windows功能(找到Windows Message Queue服务器)选项,连同所有子类一并勾上即可,自动安装。

二、使用Message Queue:

1)用于各类服务器、计算机之间的通讯:

本地,自己给自己发(直接是.\\Private$\\Queue的私有名字)。

远程计算机:

FormatName:Direct=TCP:121.0.0.1\\private$\\Queue名字
FormatName:Direct=OS:machinename\\private$\\Queue名字 (仅用于远程加了域的计算机)。
FormatName:DIRECT=http://222.10.xx.xx/msmq/Private$/Queue名字

注意:FormatName必须大小写完全按照红色的写法!"Direct"可以随意。

2)默认情况下,Queue会收到该组全部信息。有时候我们需要跨域但是指定某台计算机收到特定信息(比如N台有1,2,3……N编号的计算机都连接到某个服务器Queue,但是不同计算机有唯一编号,我发送的信息只发送给特定的计算机编号)。那么可以使用System.Message(使用前必须引用该类库)的Label,代码如下(包含收到消息后删除该信息,防止Queue里东西越来越多):

此案例是在我本人计算机上运行,界面上一个“发送”按钮和2个文本框(分别接受Label为1和2的消息),防止时间演示过长,使用了异步机制。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Messaging;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using Msg = System.Messaging.Message;

namespace MessageQueueDemo
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        private async Task<string> GetMessage(string labelId)
        {
            List<Msg> msgs = new List<Msg>();
            //监听当前自己计算机上的私有队列
            MessageQueue msgQueue = new MessageQueue(@".\private$\myQueue");
            string result = null;
            Random r = new Random();

            await Task.Run(() =>
            {
                //使用该方法允许您动态删除Queue
                var me = msgQueue.GetMessageEnumerator2();
                Msg tmpMsg = null;

                for (IEnumerator pointer = me; pointer.MoveNext();)
                {
                    //先返回当前的Queue
                    tmpMsg = (Msg)pointer.Current;
                    //如果该Label是符合当前文本框可以接受的Id,删除该Msg
                    if (tmpMsg.Label == labelId)
                    {
                        tmpMsg = me.RemoveCurrent();
                        //模拟接收的时间不同
                        Thread.Sleep(r.Next(100, 500));
                        //必须指定每一个Msg的存储信息格式
                        tmpMsg.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
                        msgs.Add(tmpMsg);
                        //必须加上去,因为删除当前的Msg之后不使用“重置”,导致MoveNext为false。
                        me.Reset();
                    }
                }
                if (msgs.Count > 0)
                {
                    result = string.Join(",", (from m in msgs
                                                   select m.Body.ToString()));
                }
            });
            return result;
        }

        private async void button1_Click(object sender, EventArgs e)
        {
            //初始化已经创建的Queue
            MessageQueue msgQueue = new MessageQueue(@".\private$\myQueue");
            //模拟发送Msg(1和2交替发送)
            for (int i = 1; i < 11; i++)
            {
                Msg message = new Msg(i % 2 == 0 ? "1" : "2", new XmlMessageFormatter(new Type[] { typeof(string) }));

                 //Send第一个参数:发送的消息对象;第二个参数:Label
                 msgQueue.Send(message, i % 2 == 0 ? "1" : "2");
            }

            //异步接收
            var content1 = await GetMessage("1");
            var content2 = await GetMessage("2");
            textBox2.Text = content1;
            textBox3.Text = content2;
        }
    }
}
时间: 2024-10-06 08:53:01

Message Queue基本使用说明的相关文章

HDU 1509 Windows Message Queue

题目链接 Problem Description Message queue is the basic fundamental of windows system. For each process, the system maintains a message queue. If something happens to this process, such as mouse click, text change, the system will add a message to the qu

HDU 1509:Windows Message Queue【优先队列】

Windows Message Queue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4505    Accepted Submission(s): 1794 Problem Description Message queue is the basic fundamental of windows system. For each

在单线程模型中 Message、Handler、Message Queue、Looper 之间的关系

Message,信息的载体,用来传递数据给Handler. Handler (Handler处理者,是 Message 的主要处理者,负责 Message 的发送,Message 内容的执行处理)发送和处理Message和Runable对象,这些对象和一个线程的MessageQueue相关联.每一个线程实例和一个单独的线程以及该线程的 MessageQueue 相关联.Handler和创建它的线程绑定在一起,把 Message和Runable 对象传递给 MessageQueue,这些对象离开

ZOJ2724_Windows Message Queue(STL/优先队列)

解题报告 题意: 看输入输出就很明白. 思路: 优先队列. #include <algorithm> #include <iostream> #include <cstring> #include <cmath> #include <queue> #include <vector> #include <cstdio> #include <map> using namespace std; struct node

hdu1509(Windows Message Queue) 优先队列

点击打开链接 Problem Description Message queue is the basic fundamental of windows system. For each process, the system maintains a message queue. If something happens to this process, such as mouse click, text change, the system will add a message to the

【排序,先入先出】Windows Message Queue

Windows Message Queue Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 73  Solved: 41 [Submit][Status][Discuss] Description Message queue is the basic fundamental of windows system. For each process, the system maintains a message queue. If something h

Windows Message Queue

D - Windows Message Queue Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit Status Practice ZOJ 2724 Description Message queue is the basic fundamental of windows system. For each process, the system maintains a messag

You Probably Don’t Need a Message Queue

原文地址 I’m a minimalist, and I don’t like to complicate software too early and unnecessarily. And adding components to a software system is one of the things that adds a significant amount of complexity. So let’s talk about message queues. Message Queu

Message、Handler、Message Queue、Looper 之间的关系

单线程模型中Message.Handler.Message Queue.Looper之间的关系 1.Message Message即为消息,可以理解为线程间交流的信息.处理数据后台线程需要更新UI,你可以发送Message内含一些数据给UI线程. 2.Handler Handler 即为处理者,是Message的主要处理者,负责Message的发送,Message内容的执行处理. 后台线程就是通过传进来的Handler对象引用来sendMessage(Message).而使用Handler,需要