C#实现消息的收发

       这个例子是我在做公司的中间件项目时写的,用于测试。希望能和开发MQ消息中间件得朋友们一起分享。

       IBM WebSphere MQ 消息队列得基础请参考前面写的一些文章。现在我将向大家介绍下我写的这个例子:

      

       开发工具:Visual Studio 2008

       开发语言:c#

 

      1.添加引用。要开发MQ 消息队列项目,必须先添加如下引用

                   using IBM.WMQ;

         安装好IBM MQ 消息队列资源管理器,就会在你安装目录下找到IBM文件夹,我们要做的是找到amqmdnet.dll 文件,并将它以引用的形式添加到解决方案中。

         注意:这并不够,你还必须手动添加两个dll文件到解决方案的bin/debug 文件夹中。这两个dll文件是amqzsaic.dll、imqc23vn.dll。这样我们就可以开发MQ得程序了,这是我自己的个人总结,如有不妥请见谅,但是,我会把我知道的以及我的体会都写在这里,好了,废话少说。

      

       2.收发类的介绍,我把代码贴在这里,若有疑问请给我留言。

 

using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using IBM.WMQ;
using System.Xml;
using System.Configuration;
using System.Windows.Forms;

namespace WindowsFormsApplicationMQ
{
    class Management
    {
        string queueName;
        MQQueueManager qMgr;
        MQMessage mqMsg;
        MQQueue queue;
        MQPutMessageOptions putOptions;

        #region   连接队列管理器
        ///


        /// **************************************************************************************************************
        ///                这部分主要的功能是连接队列管理器,而连接队列管理器之前必须要设置的环境变量主要包括:
        ///            连接的主机的IP地址HostName、通道名称Channel和端口Port此外还要有指定的队列管理器名以及队
        ///            列的名称.HostName,Channel,Port,QueueName,QueueManager在配置文件App.config中指定.
        /// **************************************************************************************************************
        ///

        public Management()
        {
           
        }
        string linkStatus;
        public string LinkToQueueManager()
        {  
            try
            {
                //从配置文件中读取值
                string HostName = ConfigurationSettings.AppSettings["HostName"];
                string Channel = ConfigurationSettings.AppSettings["Channel"];
                int Port = Convert.ToInt32(ConfigurationSettings.AppSettings["Port"]);
                string QueueName = ConfigurationSettings.AppSettings["Queue"];
                MQEnvironment.Hostname = HostName;
                MQEnvironment.Channel = Channel;
                MQEnvironment.Port = Port;
                queueName = QueueName;
                qMgr = new MQQueueManager("DOCK");        //连接队列管理器
                linkStatus = "连接队列管理器:" + HostName + "成功!";
            }
            catch (MQException e)
            {
                linkStatus ="连接队列管理器错误: 结束码:"+e.CompletionCode+" 错误原因代码:"+e.ReasonCode;
            }
           
            return linkStatus;
        }
        #endregion

        #region   发送消息
        ///


        /// *********************************************************************************************
        ///
        ///    发送消息,这里的功能是发送Xml文档,条件是必须传入文档所在的位置信息
        ///
        /// *********************************************************************************************
        ///

        ///
        public void SendMsg(string message)
        {
           int openOptions=MQC.MQOO_OUTPUT | MQC.MQOO_INPUT_SHARED | MQC.MQOO_INQUIRE;
           try
           {
               queue = qMgr.AccessQueue(queueName, openOptions);   //尝试打开队列
           }
           catch(MQException e)
           {
               MessageBox.Show("打开队列失败:"+e.Message .ToString ());
           }
           ///以Xml文档的方式发送
           ///System.Xml.XmlDocument document = new System.Xml.XmlDocument();
           ///document.Load(filepath);
           mqMsg = new MQMessage();
           mqMsg.WriteString(message );           
           putOptions = new MQPutMessageOptions(); 
           try
           {
               queue.Put(mqMsg, putOptions);        //将消息放入消息队列
           }
           catch (MQException mqe)
           {
               MessageBox.Show("发送异常终止:"+mqe .Message );
           }
        }
           
       
        #endregion

        #region   接收消息

        ///


        /// *********************************************************************************************
        ///
        ///    从队列管理器中接收消息,并转存在DataSet中
        ///
        /// *********************************************************************************************
        ///

        ///
        public DataSet receiveMsg()
        {
            int openOptions = MQC.MQOO_OUTPUT | MQC.MQOO_INPUT_SHARED | MQC.MQOO_INQUIRE;
            try
            {
                queue = qMgr.AccessQueue(queueName, openOptions);   //尝试打开队列
            }
            catch (MQException e)
            {
                MessageBox.Show("打开队列失败:" + e.Message.ToString());
            }
            //从队列管理器中获得消息
            MQGetMessageOptions mqGetMsgOpts;
            mqMsg = new MQMessage();
            mqGetMsgOpts = new MQGetMessageOptions();
            mqGetMsgOpts.WaitInterval = 15000;         
            mqGetMsgOpts.Options |= MQC.MQGMO_WAIT;
            try
            {
                int i = queue.CurrentDepth;
                if (i > 0)
                {
                    queue.Get(mqMsg, mqGetMsgOpts);          //获得消息
                }
                else
                {
                    return null;
                }
            }
            catch(MQException ex) {
                throw new Exception("访问队列停止"+ex.InnerException .ToString ());
            }
            //if (queue.CurrentDepth == 0)
            //{
            //    return null;
            //}
            DataSet ds = new DataSet();
            DataTable table = new DataTable("t_user");
            table.Columns.Add("UserID", typeof(int));
            table.Columns.Add("UserName", typeof(string));
            table.Columns.Add("Password", typeof(string));
            //table.Columns.Add("ShowOrder", typeof(int));
            //table.Columns.Add("Remark", typeof(string));
            table.Columns.Add("city", typeof(string));
            table.Columns.Add("state", typeof(string));
            table.Columns.Add("zip", typeof(string));
            table.Columns.Add("contract", typeof(string));
            ds.Tables.Add(table);
            string message = mqMsg.ReadString(mqMsg.MessageLength);
            mqMsg.Format = MQC.MQFMT_XMIT_Q_HEADER;
            System.IO.StringReader reader = new System.IO.StringReader(message );
            ds.ReadXml(reader,XmlReadMode.Fragment);
            return ds;
        }
        #endregion
    }
}

你可能感兴趣的:(WebSphere,MQ,c#,string,dataset,websphere,ibm,消息中间件)