微软MSMQ消息队列的使用

首先在windows系统中安装MSMQ

一、MSMQ交互

开发基于消息的应用程序从队列开始。MSMQ包含四种队列类型:

  • 外发队列:消息发送到目的地之前,用它来临时存储消息。

  • 公共队列:在主动目录中公布。整个网络各种服务器上的应用程序能够通过主动目录找到并应用公共队列。

  • 私有队列:这些是本地服务器上的队列,对其它服务器无效(因此这些队列不在主动目录中公布。)

  • 系统队列:包含日记队列(由系统生成)、死队列和事务型死信队列。死消息无法传送。

System.Messaging命名空间执行MSMQ的编程操作。这个命名空间有两个主要的对象:

  • Message:队列发送或读取的实际消息或数据。

  • MessageQueue:接收/发送消息的MSMQ消息队列。

二、消息队列类型

消息对列分为3类:
 
公共队列
 MachineName\QueueName
 能被别的机器所访问,如果你的多个项目中用到消息队列,那么你可以把队列定义为公共队列
 
专用队列
 MachineName\Private$\QueueName
 只针对于本机的程序才可以调用的队列,有些情况下为了安全起见定义为私有队列。
日志队列
 MachineName\QueueName\Journal$

然后编写以下代码:

消息的发送:


  class Program
{
static void Main(string[] args)
{
Message msg = null;
MessageQueue mq = null;
int count = 0;
if (MessageQueue.Exists(@".\Private$\TechRepublic"))
{
MessageQueue.Delete(@".\Private$\TechRepublic");
}
while (true)
{
count++;

try
{
msg = new Message();
msg.Priority = MessagePriority.Normal;
if (!MessageQueue.Exists(@".\Private$\TechRepublic"))
{
mq = MessageQueue.Create(@".\Private$\TechRepublic");
}
else
{
mq = new MessageQueue(@".\Private$\TechRepublic");
}
msg.Label = "Test Message" + count;
Product p = new Product
{
Id = count,
Name = "name"+count,
CreateTime = DateTime.Now
};
msg.Body = p;
mq.Send(msg);
Console.WriteLine(p.Id);

}
catch (System.Messaging.MessageQueueException ex)
{
Console.WriteLine("MSMQ Error: " + ex.ToString());
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.ToString());
}

}

#region 发送简单的类型
//try
//{
// mq = new MessageQueue(@".\Private$\TechRepublic");
// msg = mq.Receive(new TimeSpan(0, 0, 60));
// msg.Formatter = new XmlMessageFormatter(new String[] { "System.String,mscorlib" });
// //mq.Receive();
// Console.WriteLine(msg.Label.ToString() + " -- " + msg.Body.ToString());
//}
//catch (System.Messaging.MessageQueueException ex)
//{
// Console.WriteLine("MSMQ Error: " + ex.ToString());
//}
//catch (Exception ex)
//{
// Console.WriteLine("Error: " + ex.ToString());
//}
//finally
//{
// mq.Close();
//}
#endregion
Console.ReadKey();
}
}

消息的接收:


 class Program
{

static void Main(string[] args)
{
Message msg = null;
MessageQueue mq = null;

while (true)
{
Thread.Sleep(400);
try
{
if (MessageQueue.Exists(@".\Private$\TechRepublic"))
{
mq = new MessageQueue(@".\Private$\TechRepublic");
//#region 同步接收消息
//if (mq.GetAllMessages().Any())
//{
//msg = mq.Receive(new TimeSpan(0, 0, 60));
////通过Receive方法接收消息同时永久性地从队列中删除消息;
////通过Peek方法从队列中取出消息而不从队列中移除该消息。
//msg.Formatter = new XmlMessageFormatter(new String[] { "MyLib.Product,MyLib" });
//Product p = ((Product)msg.Body);
//Console.WriteLine(msg.Label.ToString() + " -- " + p.Id + " ---" + p.CreateTime);
//}
//#endregion

#region 异步接收消息

//利用委托机制:
if (mq.GetAllMessages().Any())
{
mq.BeginReceive();
mq.ReceiveCompleted += mq_ReceiveCompleted;
}
#endregion

}

}
catch (System.Messaging.MessageQueueException ex)
{
Console.WriteLine("MSMQ Error: " + ex.ToString());
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.ToString());
}
}

Console.ReadKey();
}

static void mq_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
{
MessageQueue mq = (MessageQueue)sender;
Message msg = mq.EndReceive(e.AsyncResult);
msg.Formatter = new XmlMessageFormatter(new String[] { "MyLib.Product,MyLib" });
Product p = ((Product)msg.Body);
Console.WriteLine(msg.Label.ToString() + " -- " + p.Id + " ---" + p.CreateTime);
mq.BeginReceive();//如果希望继续异步接收消息,请在 ReceiveCompleted 事件处理程序中再次调用 BeginReceive 方法
}
}


namespace MyLib
{
[Serializable]
public class Product
{
public long Id { get; set; }
public string Name { get; set; }
public DateTime CreateTime { get; set; }
public DateTime? UpdateTime { get; set; }
}
}

微软MSMQ消息队列的使用,布布扣,bubuko.com

时间: 2024-10-10 19:04:06

微软MSMQ消息队列的使用的相关文章

【转】MSMQ消息队列安装

一.Windows 7安装.管理消息队列1.安装消息队列   执行用户必须要有本地 Administrators 组中的成员身份,或等效身份.   具体步骤:    开始—>控制面板—>程序—>程序和功能—>打开或关闭Windows功能—>依次展开Microsoft Message Queue (MSMQ) 服务器.Microsoft Message Queue (MSMQ) 服务器核心—>确定   如果系统提示您重新启动计算机,请单击“确定”以完成安装.2.管理消息队

(转)MSMQ(消息队列)

原文作者:虔诚者    点此传送至原文 前段时间研究WCF接触到了MSMQ,所以认真的学习了一下,下面是我的笔记. 我理解的MSMQ MSMQ可以被看成一个数据储存装置,就如同数据库,只不过数据存储的是一条一条的记录,而MSMQ存储的是一个一个的消息(messsge).Message可以被理解为一种数据容器,我们在稍后会讲到.MSMQ一个重要的应用场景就是离线信息交互,例如,我们在给朋友发送邮件,而此时朋友并未登入邮箱,这个时候我们的邮件就可以发到邮件服务器的MSMQ队列中,当朋友登入邮箱的时候

WCF分布式开发必备知识(1):MSMQ消息队列

本章我们来了解下MSMQ的基本概念和开发过程.MSMQ全称MicroSoft Message Queue,微软消息队列,是在多个不同应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间的任一位置.它的实现原理是:消息的发送者要把自己想要发送的信息放入一个容器中(我们称之为Message),然后把它保存至一个系统公用空间的消息队列(Message Queue)中,本地或者是异地的消息接收程序再从该队列中取出发给它的消息进行处理.其中两个重要的概念

MSMQ消息队列 用法

引言 接下来的三篇文章是讨论有关企业分布式开发的文章,这三篇文章筹划了很长时间,文章的技术并不算新,但是文章中使用到的技术都是经过笔者研究实践后总结的,正所谓站在巨人的肩膀上,笔者并不是巨人,但也希望这几篇文章能够帮助初涉企业分布式开发的一些童鞋.        三篇文章将会从MessageQueue.Windows Services和WCF着手来讨论企业分布式的开发,MQ是一种消息中间件技术,该篇文章将会详细讨论.Windows Services在分布式开发中同样起着重要的作用,将会在下篇文章

MSMQ消息队列

一.引言 Windows Communication Foundation(WCF)是Microsoft为构建面向服务的应用程序而提供的统一编程模型,该服务模型提供了支持松散耦合和版本管理的序列化功能,并提供了与消息队列(MSMQ).COM+.Asp.net Web服务..NET Remoting等微软现有的分布式系统技术.利用WCF平台,开发人员可以很方便地构建面向服务的应用程序(SOA).可以认为,WCF是对之前现有的分布式技术(指的是MSMQ..NET Remoting和Web 服务等技术

跟我一起学WCF(1)——MSMQ消息队列

一.引言 Windows Communication Foundation(WCF)是Microsoft为构建面向服务的应用程序而提供的统一编程模型,该服务模型提供了支持松散耦合和版本管理的序列化功能,并提供了与消息队列(MSMQ).COM+.Asp.net Web服务..NET Remoting等微软现有的分布式系统技术.利用WCF平台,开发人员可以很方便地构建面向服务的应用程序(SOA).可以认为,WCF是对之前现有的分布式技术(指的是MSMQ..NET Remoting和Web 服务等技术

MSMQ(消息队列)续

在上一篇我简单介绍了MSMQ的相关概念,本篇将以代码说明 Message Message是MSMQ的数据存储单元,我们的用户数据一般也被填充在Message的body当中,因此很重要,让我们来看一看其在.net中的体现,如图: 在图上我们可以看见,Message提供了三个构造函数,参数body表示我们的用户数据,当我们在构造函数中传入,数据最终会被赋值给其同名属性body,参数formatter对应同名属性Formatter,它是一个序列化器,当我们的用户数据是一个复杂类型,比如类的时候Mess

MSMQ(消息队列)

前段时间研究WCF接触到了MSMQ,所以认真的学习了一下,下面是我的笔记. 我理解的MSMQ MSMQ可以被看成一个数据储存装置,就如同数据库,只不过数据存储的是一条一条的记录,而MSMQ存储的是一个一个的消息(messsge).Message可以被理解为一种数据容器,我们在稍后会讲到.MSMQ一个重要的应用场景就是离线信息交互,例如,我们在给朋友发送邮件,而此时朋友并未登入邮箱,这个时候我们的邮件就可以发到邮件服务器的MSMQ队列中,当朋友登入邮箱的时候,系统在从服务器的MSMQ队列中取出U件

MSMQ消息队列总结

1.总体介绍: http://www.cnblogs.com/beniao/archive/2008/06/26/1229934.html 2.windows服务各项参数介绍及安装 https://www.cnblogs.com/xujie/p/5695673.html 3.遇到的问题 3.1.网络中传输信息 应该使用Json/XML格式传输: 3.2.GetAllMessages()方法:得到队列中的所有消息,但是未移除消息: 3.3.权限不足 3.3.1.本机(win7)配置  消息队列给e