.Net环境下操作IBM WebShpere MQ

IBM WebShpere MQ 简单介绍:

具体的详细信息大家可以在IBM的网站和网上有许多的学习资料。

IBM MQ是实现了消息队列的一个中间件,它可以运行在现在所有流行的平台上。在我们的项目中主要使用的是AS400和UNIX平台上。

在IBM MQ中主要分为以下几个对象:

 

Queue Manager

队列管理器

主要负责管理队列、通道等,类似与Oracle中的Oracle实例的概念,在一台服务器中可以定义多个Queue Manager。

Queue

队列

是存放Message的对象,是我们主要操作的对象。类似与Oracle中的表的概念。

Message

消息

实际放入Queue中的消息,该消息可以存储字符串、Stream等对象。

Channel

通道

是我们的应用以及两个Queue Manager操作的链接对象

Process

过程

 

 

Queue的分类:

Local Queue

本地队列

主要存储消息的对象

Remote Queue

远程队列

和另外一个Queue Manager通讯的队列

Mode Queue

模板队列

建立一个队列模板,通过这个模板可以建立与模板相同属性的动态队列。

Dynamic Queue

动态对了(临时队列)

可以在程序中创建和删除的临时队列

 

Channel类型:

在我们介绍中只使用了类型为SVRCONN的通道。


 

.Net连接Queue Manager的关键要素:

.Net的程序需要以下几个关键要素才能连接的一个Queue Manager上。

1、  Address & Port

MQ的服务器地址以及要连接的Queue Manager的监听端口,默认端口1414。

2、  Queue Manager Name

要连接的Queue Manager的名字,区分大小写,默认全部大写。

3、  Channel Name

SVRCONN类型的Channel的名字,需要注意的是该Channel的属性MCAUSER必须设置为一个足够权限的系统用户,否则不能连接成功。

4、  CCSID

CCSID是Queue Manager的编码字符集,需要Queue Manager的CCSID与你的.Net操作系统的CCSID互相兼容或者一致才能成功连接。默认情况下UNIX平台的Queue Manager的CCSID为819,而简体中文版的Windows的CCSID为1381。这两个编码字符集是不能兼容的,所以需要调整。

调整有两种方式:

1)  调整Queue Manager的CCSID,调整成与1381兼容的即可,不一定需要调整成1381

2)  在不能调整Queue Manager时需要配置Windows的环境变量,在Windows的环境变量中增加MQCCSID的环境变量,值需要与Queue Manager的CCSID一致或兼容。

 

在我们介绍的例子中使用环境如下:

 

Server:Sun OS 5.9

Address

192.168.128.115

Port

1414(默认端口)

Queue Manager Name

SGS.MGR

Channel Name

SGS.CHANNEL

 

Queue Manager的属性如下(注意红色部分):

Display Queue Manager details.

   DESCR( )                                DEADQ( )

   DEFXMITQ( )                             CHADEXIT( )

   CLWLEXIT( )                             CLWLDATA( )

   REPOS( )                                REPOSNL( )

   COMMANDQ(SYSTEM.ADMIN.COMMAND.QUEUE)    QMNAME(SGS.MGR)

   CRDATE(2007-04-02)                      CRTIME(16.24.23)

   ALTDATE(2007-04-02)                     ALTTIME(16.24.23)

   QMID(SGS.MGR_2007-04-02_16.24.23)       TRIGINT(999999999)

   MAXHANDS(256)                           MAXUMSGS(10000)

   AUTHOREV(DISABLED)                      INHIBTEV(DISABLED)

   LOCALEV(DISABLED)                       REMOTEEV(DISABLED)

   PERFMEV(DISABLED)                       STRSTPEV(ENABLED)

   CHAD(DISABLED)                          CHADEV(DISABLED)

   CLWLLEN(100)                            MAXMSGL(4194304)

   CCSID(819)                              MAXPRTY(9)

   CMDLEVEL(510)                           PLATFORM(UNIX)

   SYNCPT                                  DISTL(YES)

 

Channel的属性如下(注意红色部分):

Display Channel details.

   CHANNEL(SGS.CHANNEL)                    CHLTYPE(SVRCONN)

   TRPTYPE(TCP)                            DESCR( )

   SCYEXIT( )                              MAXMSGL(4194304)

   SCYDATA( )                              HBINT(300)

   MCAUSER(mqm)                            ALTDATE(2007-04-02)

   ALTTIME(16.30.23)

   SENDEXIT( )

   RCVEXIT( )

   SENDDATA( )

   RCVDATA( )

 

由于Queue Manager的CCSID使用819,故增加系统的环境变量:

 



环境准备:

1、  安装IBM WebSphere MQ Client for Windows。(MQ客户端)

2、  安装WebSphere MQ classes for Microsoft .NET.msi。(.Net插件)

3、  在你的.Net项目中引用 amqmdnet.dll,该dll在.Net插件安装目录中可以找到。

 

开始编写代码:

链接MQManager 及远程队列写入信息:

 public class ZYTaskMQDAC
    {
        private MQQueueManager mqQMgr = null;
        private MQQueue mqueue = null;

        public ZYTaskMQDAC()
        {
            CreateCon();
            CreateQueue();
        }

        /// <summary>
        /// 创建队列管理器
        /// </summary>
        public void CreateCon()
        {
            if (this.mqQMgr == null)
            {
                try
                {
                    string hostname =  ConfigurationManager.AppSettings["HostName"];                         //服务器的IP
                    string channel =ConfigurationManager.AppSettings["Channel"] ;                      //服务器通道
                    string qManager = ConfigurationManager.AppSettings["MQManaager"];                //队列管理器名称
                    string userName =ConfigurationManager.AppSettings["UserName"] ;                     //用户名
                    string pword =ConfigurationManager.AppSettings["Password"] ;                      //用户密
                    int mQPort=Convert.ToInt32(ConfigurationManager.AppSettings["MQPort"]);          //MQ端口
                    //初始化环境变量
                    MQEnvironment.Hostname = hostname;
                    MQEnvironment.Channel = channel;
                    MQEnvironment.Port = mQPort;
                    MQEnvironment.UserId = userName;
                    MQEnvironment.Password = pword;

                    //构造队列管理器
                    this.mqQMgr = new MQQueueManager(qManager);
                }
                catch (MQException ex)
                {
                    //日子记录创建列管理器 失败
                    ExceptionService.Current.Handle(ex);
                    this.mqQMgr = null;
                }
            }
        }


        /// <summary>
        /// 创建队列
        /// </summary>
        private void CreateQueue()
        {
           string sendQueue=ConfigurationManager.AppSettings["SendQueue"]; //发送队列名称
           try
            {
                if (this.mqQMgr == null)
                    return;

                //通过MQ管理创建队列实例
                int openOptions = MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING | MQC.MQOO_INQUIRE;
                mqueue = this.mqQMgr.AccessQueue(sendQueue, openOptions);
            }
            catch (MQException ex)
            {
                //日志记录 链接队列管理失败!
                ExceptionService.Current.Handle(ex);
            }
        }

        /// <summary>
        /// 写入队列信息
        /// </summary>
        /// <param name="_strMsg"></param>
        public void PutMsgToMQ(string _strMsg)
        {
            MQMessage mqmsg = null;
            try
            {
                //创建消息操作实例
                MQPutMessageOptions pmo = new MQPutMessageOptions();

                //创建消息实例
                mqmsg = new MQMessage();

                mqmsg.CharacterSet = 1208;       //设置消息编码为UTF-8
                mqmsg.WriteString(_strMsg);
                mqmsg.Format = MQC.MQFMT_STRING; //制定消息格式为String

                //发送消息
                mqueue.Put(mqmsg, pmo);

            }
            catch (MQException ex)
            {
                //日志记录 发送消息失败
                ExceptionService.Current.Handle(ex);
            }
        }

        /// <summary>
        /// 关闭队列 释放连接
        /// </summary>
        public void CloseMQ()
        {
            if(mqueue!=null)
                mqueue.Close();
            if(mqQMgr!=null)
            {
                mqQMgr.Disconnect();
                mqQMgr = null;
            }
        }
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值