热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

消息队列MSMQ的使用实例-PHP源码

消息队列MSMQ的使用实例
消息队列:是在消息传输过程中保存消息的容器。MSMQ是Microsoft的消息处理技术,运行平台为Microsoft Windows操作系统。它分为用户队列和系统队列。在用户队列中又分为专用队列:不在整个网络中发布,仅在所驻留的本地计算机上可用。专用队列只能由知道队列的完整路径名或标签的用户程序访问。
  关于消息队列的安装,可以通过控制面板->添加/删除程序->添加/删除 Windows 组件。

  选择“消息队列”并单击“详细信息”。

  如果运行的是 Windows Server 2003,请选择“应用程序服务器”来访问消息队列。

  确保包括“MSMQ HTTP 支持”在内的所有选项在详细信息页上均处于选定状态。

  单击“确定”退出详细信息页,然后单击“下一步”。完成安装。

  

  这里我们通过实例来说明如何创建队列、发送消息、接收消息。

创建队列:
创建本机队列:@".\private$\队列名称"
创建远程队列:@"FormatName:DIRECT=TCP:远程机器IP\private$\队列名称"

实例化消息队列

        /// 
        /// 
        /// 是否为本机
        public MSMQManager(bool isLocalComputer)
        {
            if (isLocalComputer)
            {
                _path = @".\private$\" + (ConfigurationManager.AppSettings["MSMQName"] ?? "CSMSMQ");
            }
            else
            {
                _path = @"FormatName:DIRECT=TCP:192.168.1.125\private$\" + (ConfigurationManager.AppSettings["MSMQName"] ?? "CSMSMQ");
            }
            _msmq = new MessageQueue(_path);
        }

创建队列

        /// 
        /// 创建队列
        /// 
        /// 是否启用事务
        /// 
        public bool Create(bool transactional)
        {
            if (MessageQueue.Exists(@".\private$\" + (ConfigurationManager.AppSettings["MSMQName"] ?? "CSMSMQ")))
            {
                return true;
            }
            else
            {
                if (MessageQueue.Create(@".\private$\" + (ConfigurationManager.AppSettings["MSMQName"] ?? "CSMSMQ"), transactional) != null)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }

发送消息队列

        /// 
        /// 发送消息队列
        /// 
        /// 消息队列实体
        /// 
        public void Send(MSMQIndex msmqIndex)
        {
            _msmq.Send(new Message(msmqIndex, new BinaryMessageFormatter()));
        }

接收消息队列,删除队列

        /// 
        /// 接收消息队列,删除队列
        /// 
        /// 
        public MSMQIndex ReceiveAndRemove()
        {
            MSMQIndex msmqIndex = null;
            _msmq.Formatter = new BinaryMessageFormatter();
            Message msg = null;
            try
            {
                msg = _msmq.Receive(new TimeSpan(0, 0, 1));
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            if (msg != null)
            {
                msmqIndex = msg.Body as MSMQIndex;
            }
            return msmqIndex;
        }

以上代码大致说明了消息队列的创建、发送与接收,下面给出消息队列管理器的全部代码。并在附件中给出DEMO,在您安装完成消息队列后,此DEMO可以正常运行,希望对有这方面需求的人有所帮助。

消息队列管理器

using System;
using System.Collections.Generic;
using System.Text;
using System.Messaging;
using System.Configuration;
namespace MSMQTest.Model
{    
    /// 
    /// 消息队列管理器
    /// 作者:心海巨澜 xinhaijulan@gmail.com
    /// 
    public class MSMQManager : IDisposable
    {
        #region 字段与属性
        private MessageQueue _msmq = null;
        private string _path;
     
        private static MSMQManager _instanceLocalComputer = new MSMQManager(true);
        /// 
        /// 本机消息队列实例
        /// 
        public static MSMQManager InstanceLocalComputer
        {
            get { return MSMQManager._instanceLocalComputer; }
        }
        private static MSMQManager _instance = new MSMQManager(false);
        /// 
        /// 远程消息队列实例
        /// 
        public static MSMQManager Instance
        {
            get { return MSMQManager._instance; }
        }
        #endregion
        /// 
        /// 创建队列
        /// 
        /// 是否启用事务
        /// 
        public bool Create(bool transactional)
        {
            if (MessageQueue.Exists(@".\private$\" + (ConfigurationManager.AppSettings["MSMQName"] ?? "CSMSMQ")))
            {
                return true;
            }
            else
            {
                if (MessageQueue.Create(@".\private$\" + (ConfigurationManager.AppSettings["MSMQName"] ?? "CSMSMQ"), transactional) != null)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }
        /// 
        /// 实例化消息队列
        /// 
        /// 是否为本机
        public MSMQManager(bool isLocalComputer)
        {
            if (isLocalComputer)
            {
                _path = @".\private$\" + (ConfigurationManager.AppSettings["MSMQName"] ?? "CSMSMQ");
            }
            else
            {
                _path = @"FormatName:DIRECT=TCP:192.168.1.125\private$\" + (ConfigurationManager.AppSettings["MSMQName"] ?? "CSMSMQ");
            }
            _msmq = new MessageQueue(_path);
        }
        /// 
        /// 发送消息队列
        /// 
        /// 消息队列实体
        /// 
        public void Send(MSMQIndex msmqIndex)
        {
            _msmq.Send(new Message(msmqIndex, new BinaryMessageFormatter()));
        }
        /// 
        /// 接收消息队列,删除队列
        /// 
        /// 
        public MSMQIndex ReceiveAndRemove()
        {
            MSMQIndex msmqIndex = null;
            _msmq.Formatter = new BinaryMessageFormatter();
            Message msg = null;
            try
            {
                msg = _msmq.Receive(new TimeSpan(0, 0, 1));
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            if (msg != null)
            {
                msmqIndex = msg.Body as MSMQIndex;
            }
            return msmqIndex;
        }
        #region IDisposable Members
        public void Dispose()
        {
            if (_msmq != null)
            {
                _msmq.Close();
                _msmq.Dispose();
                _msmq = null;
            }
        }
        #endregion
    }
}

此DEMO只是消息队列的介绍与使用,还有一些消息队列概念未加说明,比如:

  消息队列的创建方式:通过路径、通过格式名、通过标签;

  消息队列接收方式:同步与异步;

  消息队列序列化:字符、XML、二进制;

  以及是否使用事务等。

推荐阅读
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 优化联通光猫DNS服务器设置
    本文详细介绍了如何为联通光猫配置DNS服务器地址,以提高网络解析效率和访问体验。通过智能线路解析功能,域名解析可以根据访问者的IP来源和类型进行差异化处理,从而实现更优的网络性能。 ... [详细]
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • 本文详细介绍了如何使用PHP检测AJAX请求,通过分析预定义服务器变量来判断请求是否来自XMLHttpRequest。此方法简单实用,适用于各种Web开发场景。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • 本文详细分析了Hive在启动过程中遇到的权限拒绝错误,并提供了多种解决方案,包括调整文件权限、用户组设置以及环境变量配置等。 ... [详细]
  • 本文探讨了如何优化和正确配置Kafka Streams应用程序以确保准确的状态存储查询。通过调整配置参数和代码逻辑,可以有效解决数据不一致的问题。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 本文探讨了在 ASP.NET MVC 5 中实现松耦合组件的方法。通过分离关注点,应用程序的各个组件可以更加独立且易于维护和测试。文中详细介绍了依赖项注入(DI)及其在实现松耦合中的作用。 ... [详细]
author-avatar
yan雀安知鸿鹄之志_647
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有