在C#中使用MSMQ的方法

MSMQ (Microsoft消息队列)是Windows中默认可用的消息队列。作为跨计算机系统发送和接收消息的可靠方法,MSMQ提供了一个可伸缩、线程安全、简单和使用方便的队列,同时为你提供了在Windows数据库中持久化消息的机会。MSDN指出:“消息队列(MSMQ)技术使在不同时间运行的应用程序能够在可能暂时离线的异构网络和系统之间进行通信。应用程序将消息发送到队列并从队列读取消息。”

在使用MSMQ时,通常有两个不同的应用程序——发送者和接收者。当消息由发送者发送时,接收者应用程序不需要处于执行状态——消息实际上存储在由主机操作系统维护的队列中,当接收方应用程序需要它们时,这些消息就会脱离队列。

创建一个队列

你可以通过控制面板上的“打开或关闭Windows功能”选项打开你系统中的MSMQ。在系统中安装了MSMQ之后,创建队列就很简单了。只要到“我的电脑”,右击并选择管理。在“计算机管理”窗口中,你可以从“消息队列”节点创建一个新队列。还可以通过编程方式创建队列。

C#中的MSMQ

要使用MSMQ,你需要引入System.Messaging命名空间。要以编程方式创建队列,需要利用MessageQueue类的Create方法。下面的代码片段说明了这一点。

MessageQueue.Create(@".\Private$\IDG");

要创建队列并向其发送消息,可以使用以下代码片段:

messageQueue = new MessageQueue(@".\Private$\IDG");
messageQueue.Label = "This is a test queue.";
messageQueue.Send("This is a test message.", "IDG");

现在,假设你想检查队列是否存在,如果存在,则发送一条消息给它。如果队列不存在,你可能希望创建一个新队列,然后向它发送消息。这正是下面的代码清单所做的。

static void Main(string[] args)
{
  MessageQueue messageQueue = null;
  string description = "This is a test queue.";
  string message = "This is a test message.";
  string path = @".\Private$\IDG";
  try
  {
    if (MessageQueue.Exists(path))
    {
      messageQueue = new MessageQueue(path);
      messageQueue.Label = description;
    }
    else
    {
      MessageQueue.Create(path);
      messageQueue = new MessageQueue(path);
      messageQueue.Label = description;
    }
    messageQueue.Send(message);
  }
  catch
  {
    throw;
  }
  finally
  {
    messageQueue.Dispose();
  }
}

下面的代码清单演示了如何使用c#处理存储在消息队列中的消息。

private static List<string> ReadQueue(string path)
{
  List<string> lstMessages = new List<string>();
  using (MessageQueue messageQueue = new MessageQueue(path))
  {
    System.Messaging.Message[] messages = messageQueue.GetAllMessages();
    foreach (System.Messaging.Message message in messages)
    {
      message.Formatter = new XmlMessageFormatter(
      new String[] { "System.String, mscorlib" });
      string msg = message.Body.ToString();
      lstMessages.Add(msg);
    }
  }
  return lstMessages;
}

接下来,可以调用ReadQueue方法来检索存储在消息队列中的消息,如下面的代码片段所示。

string path = @".\Private$\IDG";
List<string> lstMessages = ReadQueue(path);

你还可以在消息队列中存储对象。例如,假设你需要将日志消息存储到队列中。日志消息存储在LogMessage类的一个实例中,该实例包含与日志消息的详细信息相关的必要属性。下面是LogMessage类——我只使用了两个属性来使它变得简单。

public class LogMessage
{
  public string MessageText { get; set; }
  public DateTime MessageTime { get; set; }
}

你应该修改LogMessage类,以包含其他必要的属性,例如,消息严重性等。下面的方法说明了如何将LogMessage类的实例存储到消息队列中。

private static void SendMessage(string queueName, LogMessage msg)
{
  MessageQueue messageQueue = null;
  if (!MessageQueue.Exists(queueName))
    messageQueue = MessageQueue.Create(queueName);
  else
    messageQueue = new MessageQueue(queueName);
  try
  {
    messageQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(LogMessage) });
    messageQueue.Send(msg);
  }
  catch
  {
    //Write code here to do the necessary error handling.
  }
  finally
  {
    messageQueue.Close();
  }
}

下面的代码片段说明了如何创建LogMessage类的实例,向其填充数据,然后调用SendMessage方法来存储在消息队列中创建的实例。

LogMessage msg = new LogMessage()
{
  MessageText = "This is a test message.",
  MessageTime = DateTime.Now
};
SendMessage(@".\Private$\IDGLog", msg);

下面的代码清单演示了如何读取存储在消息队列中的LogMessage实例。

private static LogMessage ReceiveMessage(string queueName)
{
  if (!MessageQueue.Exists(queueName))
    return null;
  MessageQueue messageQueue = new MessageQueue(queueName);
  LogMessage logMessage = null;
  try
  {
    messageQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(LogMessage) });
    logMessage = (LogMessage)messageQueue.Receive().Body;
  }
  catch { }
  finally
  {
    messageQueue.Close();
  }
  return logMessage;
}

以上就是在C#中使用MSMQ的方法的详细内容,更多关于c# 使用msmq的资料请关注我们其它相关文章!

(0)

相关推荐

  • .net msmq消息队列实例详解

    本文为大家分享了.net msmq消息队列实例代码,供大家参考,具体内容如下 1.msmq消息队列windows环境安装 控制面板---->程序和功能---->启用或关闭Windows程序---->Microsoft Message Queue(MSMQ)服务器 选中如图所示功能点击"确认"进行安装,安装好后可在 "计算机管理"中进行查看 2.创建消息队列实体对象 /// <summary> /// 消息实体 /// </summ

  • 基于ajax与msmq技术的消息推送功能实现代码

    周末在家捣鼓了一下消息推送的简单例子,其实也没什么技术含量,欢迎大伙拍砖. 我设计的这个推送demo是基于ajax长轮询+msmq消息队列来实现的,具体交互过程如下图: 先说说这个ajax长轮询,多长时间才算长呢?这个还真不好界定. 这里是相对普通ajax请求来说的,通常处理一个请求也就是毫秒级别的时间.但是这里的长轮询方式 在ajax发送请求给服务器之后,服务器给调用端返回数据的时间多长那可还真不好说.嘿嘿,这关键要看 我们啥时候往msmq队列中推送数据了,先看看推送的效果图吧..... 抱歉

  • 在C#中使用MSMQ的方法

    MSMQ (Microsoft消息队列)是Windows中默认可用的消息队列.作为跨计算机系统发送和接收消息的可靠方法,MSMQ提供了一个可伸缩.线程安全.简单和使用方便的队列,同时为你提供了在Windows数据库中持久化消息的机会.MSDN指出:"消息队列(MSMQ)技术使在不同时间运行的应用程序能够在可能暂时离线的异构网络和系统之间进行通信.应用程序将消息发送到队列并从队列读取消息." 在使用MSMQ时,通常有两个不同的应用程序--发送者和接收者.当消息由发送者发送时,接收者应用程

  • AngularJs中route的使用方法和配置

    angular是Google开发的一个单页面应用框架,是现在比较主流的单页面应用框架之一.该强大的地方有很多,比如双向数据绑定,应用了后端的MVC模式到前端,自定义指令等. 既然是单页面应用,肯定离不开页面的切换.我们首先来说一下angular的路由. angular实现页面切换时用了route. <script src="js/plugins/angular/angular.min.js"></script> <script src="js/p

  • 深入学习JavaScript的AngularJS框架中指令的使用方法

    指令(Directives)是所有AngularJS应用最重要的部分.尽管AngularJS已经提供了非常丰富的指令,但还是经常需要创建应用特定的指令.这篇教程会为你讲述如何自定义指令,以及介绍如何在实际项目中使用.在这篇文章的最后(第二部分),我会指导你如何使用Angular指令来创建一个简单的记事本应用. 概述 一个指令用来引入新的HTML语法.指令是DOM元素上的标记,使元素拥有特定的行为.举例来说,静态的HTML不知道如何来创建和展现一个日期选择器控件.让HTML能识别这个语法,我们需要

  • AngularJS入门教程二:在路由中传递参数的方法分析

    本文实例讲述了AngularJS在路由中传递参数的方法.分享给大家供大家参考,具体如下: 我们不仅可以在控制器中直接定义属性的值,比如: app.controller('listController',function($scope){ $scope.name="ROSE"; }); AngularJS还提供了传递参数的功能,目前我接触到的一种方式是从视图中传参: <!--首页html--> <li><a href="#/user/18"

  • Java中synchronized关键字修饰方法同步的用法详解

    Java的最基本的同步方式,即使用synchronized关键字来控制一个方法的并发访问. 每一个用synchronized关键字声明的方法都是临界区.在Java中,同一个对象的临界区,在同一时间只有一个允许被访问. 静态方法则有不同的行为.用synchronized关键字声明的静态方法,同时只能够被一个执行线程访问,但是其他线程可以访问这个对象的非静态的synchronized方法.必须非常谨慎这一点,因为两个线程可以同时访问一个对象的两个不同的synchronized方法,即其中一个是静态s

  • python编程之requests在网络请求中添加cookies参数方法详解

    哎,好久没有学习爬虫了,现在想要重新拾起来.发现之前学习爬虫有些粗糙,竟然连requests中添加cookies都没有掌握,惭愧.废话不宜多,直接上内容. 我们平时使用requests获取网络内容很简单,几行代码搞定了,例如: import requests res=requests.get("https://cloud.flyme.cn/browser/index.jsp") print res.content 你没有看错,真的只有三行代码.但是简单归简单,问题还是不少的. 首先,这

  • JS使用正则表达式除去字符串中重复字符的方法

    本文实例讲述了JS使用正则表达式除去字符串中重复字符的方法.分享给大家供大家参考,具体如下: 这里演示一个简单的JavaScript正则表达式实例,将一串含有重复字符串中的多余字符滤除掉,请运行查看效果. 具体代码如下: <html> <head> <title>利用正则表达法除去字符串中的重复字符</title> </head> <body> <script language="javascript">

  • js正则表达式中test,exec,match方法的区别说明

    js正则表达式中test,exec,match方法的区别说明 test test 返回 Boolean,查找对应的字符串中是否存在模式.var str = "1a1b1c";var reg = new RegExp("1.", "");alert(reg.test(str)); // true exec exec 查找并返回当前的匹配结果,并以数组的形式返回.var str = "1a1b1c";var reg = new R

  • Python读取mp3中ID3信息的方法

    本文实例讲述了Python读取mp3中ID3信息的方法.分享给大家供大家参考.具体分析如下: pyid3不好用,常常有不认识的. mutagen不错,不过默认带的easyid3不会读取注释,需要手工hack一下 Python代码如下: from mutagen.mp3 import MP3 import mutagen.id3 from mutagen.easyid3 import EasyID3 EasyID3.valid_keys["comment"]="COMM::'X

  • Python实现比较两个文件夹中代码变化的方法

    本文实例讲述了Python实现比较两个文件夹中代码变化的方法.分享给大家供大家参考.具体如下: 这里将修改代码后的目录与原始目录做对比,罗列出新增的代码文件,以及修改过的代码文件 # -*- coding: utf-8 -*- import os; folderA = "F:\\Projects\\FreeImageV3_14_1\\".lower(); folderB = u"E:\\Software\\图像解码库\\FreeImage3141\\FreeImage\\&q

随机推荐