.Net环境下操作IBM WebShpere MQ

时间:2024-03-20 10:47:54

.Net环境下操作IBM WebShpere MQ

 

大约在两年前项目使用了IBM MQ,本人积累了部分在.Net环境下操作IBM MQ的经验。现将经验与大家分享。

 

IBM WebShpere MQ 简单介绍:

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

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

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

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

调整有两种方式:

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

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

 

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

 

ServerSun 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(<chsdate w:st="on" year="2007" month="4" day="2" islunardate="False" isrocdate="False">2007-04-02</chsdate>)                      CRTIME(<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">16.24.23</chsdate>)

   ALTDATE(<chsdate w:st="on" year="2007" month="4" day="2" islunardate="False" isrocdate="False">2007-04-02</chsdate>)                     ALTTIME(<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">16.24.23</chsdate>)

   QMID(SGS.MGR_<chsdate w:st="on" year="2007" month="4" day="2" islunardate="False" isrocdate="False">2007-04-02</chsdate>_<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">16.24.23</chsdate>)       TRIGINT(999999999)

   MAXHANDS(256)                           MAXUMSGS(10000)

   AUTHOREV(DISABLED)                      INHIBTEV(DISABLED)

   LOCALEV(DISABLED)                       REMOTEEV(DISABLED)

   PERFMEV(DISABLED)                       STRSTPEV(ENABLED)

   <country-region w:st="on"><place w:st="on">CHAD</place></country-region>(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(<chsdate w:st="on" year="2007" month="4" day="2" islunardate="False" isrocdate="False">2007-04-02</chsdate>)

   ALTTIME(<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">16.30.23</chsdate>)

   SENDEXIT( )

   RCVEXIT( )

   SENDDATA( )

   RCVDATA( )

 

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

<shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="[email protected]@[email protected]@[email protected]@[email protected]@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype>

.Net环境下操作IBM WebShpere MQ

 



环境准备:

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

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

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

 

开始编写代码:

 

连接Queue Manager

.Net环境下操作IBM WebShpere MQ//MQ管理实例
.Net环境下操作IBM WebShpere MQ

.Net环境下操作IBM WebShpere MQ              
private MQQueueManager      mqQMgr=null;// MQQueueManager instance
.Net环境下操作IBM WebShpere MQ

.Net环境下操作IBM WebShpere MQ 
.Net环境下操作IBM WebShpere MQ
.Net环境下操作IBM WebShpere MQ
private void CreateMng()
.Net环境下操作IBM WebShpere MQ
.Net环境下操作IBM WebShpere MQ.Net环境下操作IBM WebShpere MQ              
.Net环境下操作IBM WebShpere MQ{
.Net环境下操作IBM WebShpere MQ
.Net环境下操作IBM WebShpere MQ                     
if(this.mqQMgr==null)
.Net环境下操作IBM WebShpere MQ
.Net环境下操作IBM WebShpere MQ.Net环境下操作IBM WebShpere MQ                     
.Net环境下操作IBM WebShpere MQ{
.Net环境下操作IBM WebShpere MQ
.Net环境下操作IBM WebShpere MQ                            
try
.Net环境下操作IBM WebShpere MQ
.Net环境下操作IBM WebShpere MQ.Net环境下操作IBM WebShpere MQ                            
.Net环境下操作IBM WebShpere MQ{     this.log("Create Queue Manager");                      
.Net环境下操作IBM WebShpere MQ
.Net环境下操作IBM WebShpere MQ                                   
.Net环境下操作IBM WebShpere MQ
.Net环境下操作IBM WebShpere MQ                                   
//通过MQ管理名创建MQ管理实例
.Net环境下操作IBM WebShpere MQ
.Net环境下操作IBM WebShpere MQ                    
//判断是远程连接还是本地连接
.Net环境下操作IBM WebShpere MQ

.Net环境下操作IBM WebShpere MQ                                   
if(!this.checkBox1.Checked)  //本地连接 (服务器连接)
.Net环境下操作IBM WebShpere MQ

.Net环境下操作IBM WebShpere MQ                                          
this.mqQMgr = new MQQueueManager(this.tbQMng.Text);
.Net环境下操作IBM WebShpere MQ
.Net环境下操作IBM WebShpere MQ                                   
else   //远程连接(客户端连接)
.Net环境下操作IBM WebShpere MQ

.Net环境下操作IBM WebShpere MQ.Net环境下操作IBM WebShpere MQ                                   
.Net环境下操作IBM WebShpere MQ{
.Net环境下操作IBM WebShpere MQ
.Net环境下操作IBM WebShpere MQ                                          
string hostname = this.tbConnection.Text; //Server地址
.Net环境下操作IBM WebShpere MQ

.Net环境下操作IBM WebShpere MQ                                          
string channel = this.tbChannel.Text;   //Channel 名
.Net环境下操作IBM WebShpere MQ

.Net环境下操作IBM WebShpere MQ                                          
string qManager = this.tbQMng.Text;   //Queue Manager名
.Net环境下操作IBM WebShpere MQ
.Net环境下操作IBM WebShpere MQ 
.Net环境下操作IBM WebShpere MQ
.Net环境下操作IBM WebShpere MQ                                          
//初始化环境变量
.Net环境下操作IBM WebShpere MQ

.Net环境下操作IBM WebShpere MQ                                          
.Net环境下操作IBM WebShpere MQ
.Net环境下操作IBM WebShpere MQ                                          MQEnvironment.Hostname 
= hostname;
.Net环境下操作IBM WebShpere MQ
.Net环境下操作IBM WebShpere MQ                                          MQEnvironment.Channel 
= channel;
.Net环境下操作IBM WebShpere MQ
.Net环境下操作IBM WebShpere MQ                                          MQEnvironment.Port 
= Int32.Parse(this.textBox1.Text); //端口号
.Net环境下操作IBM WebShpere MQ

.Net环境下操作IBM WebShpere MQ                                          
.Net环境下操作IBM WebShpere MQ
.Net环境下操作IBM WebShpere MQ                                          
this.mqQMgr =new MQQueueManager(qManager);
.Net环境下操作IBM WebShpere MQ
.Net环境下操作IBM WebShpere MQ                                          
.Net环境下操作IBM WebShpere MQ
.Net环境下操作IBM WebShpere MQ                                   }

.Net环境下操作IBM WebShpere MQ
.Net环境下操作IBM WebShpere MQ                                   
.Net环境下操作IBM WebShpere MQ
.Net环境下操作IBM WebShpere MQ                                   
this.log("Create Queue Manager Sucess");
.Net环境下操作IBM WebShpere MQ
.Net环境下操作IBM WebShpere MQ                            }

.Net环境下操作IBM WebShpere MQ
.Net环境下操作IBM WebShpere MQ                            
catch(MQException ex)
.Net环境下操作IBM WebShpere MQ
.Net环境下操作IBM WebShpere MQ.Net环境下操作IBM WebShpere MQ                            
.Net环境下操作IBM WebShpere MQ{
.Net环境下操作IBM WebShpere MQ
.Net环境下操作IBM WebShpere MQ                                   
this.mqQMgr=null;
.Net环境下操作IBM WebShpere MQ
.Net环境下操作IBM WebShpere MQ                                   
this.log("Create Queue Manager Failed!"+ex.Message+"reason:" + Convert.ToString( ex.Reason,16));
.Net环境下操作IBM WebShpere MQ
.Net环境下操作IBM WebShpere MQ                            }

.Net环境下操作IBM WebShpere MQ
.Net环境下操作IBM WebShpere MQ                     }

.Net环境下操作IBM WebShpere MQ
.Net环境下操作IBM WebShpere MQ              }

.Net环境下操作IBM WebShpere MQ
.Net环境下操作IBM WebShpere MQ

 

向本地队列(SGS.IN.01)放入消息:

 

  1.Net环境下操作IBM WebShpere MQprivate void button1_Click(object sender, System.EventArgs e)
  2.Net环境下操作IBM WebShpere MQ
  3.Net环境下操作IBM WebShpere MQ.Net环境下操作IBM WebShpere MQ              .Net环境下操作IBM WebShpere MQ{
  4.Net环境下操作IBM WebShpere MQ
  5.Net环境下操作IBM WebShpere MQ                     //定义队列
  6.Net环境下操作IBM WebShpere MQ
  7.Net环境下操作IBM WebShpere MQ                     MQQueue             mqQueue=null;
  8.Net环境下操作IBM WebShpere MQ
  9.Net环境下操作IBM WebShpere MQ 
 10.Net环境下操作IBM WebShpere MQ
 11.Net环境下操作IBM WebShpere MQ                     this.CreateMng();  //连接Queue Manager
 12.Net环境下操作IBM WebShpere MQ
 13.Net环境下操作IBM WebShpere MQ 
 14.Net环境下操作IBM WebShpere MQ
 15.Net环境下操作IBM WebShpere MQ                     try
 16.Net环境下操作IBM WebShpere MQ
 17.Net环境下操作IBM WebShpere MQ.Net环境下操作IBM WebShpere MQ                     .Net环境下操作IBM WebShpere MQ{
 18.Net环境下操作IBM WebShpere MQ
 19.Net环境下操作IBM WebShpere MQ                            if(this.mqQMgr==null)
 20.Net环境下操作IBM WebShpere MQ
 21.Net环境下操作IBM WebShpere MQ                                   return;
 22.Net环境下操作IBM WebShpere MQ
 23.Net环境下操作IBM WebShpere MQ 
 24.Net环境下操作IBM WebShpere MQ
 25.Net环境下操作IBM WebShpere MQ                            this.log("Create MQQueue");
 26.Net环境下操作IBM WebShpere MQ
 27.Net环境下操作IBM WebShpere MQ 
 28.Net环境下操作IBM WebShpere MQ
 29.Net环境下操作IBM WebShpere MQ                            //通过MQ管理创建队列实例
 30.Net环境下操作IBM WebShpere MQ
 31.Net环境下操作IBM WebShpere MQ                            mqQueue=this.mqQMgr.AccessQueue(this.tbQName.Text,MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING | MQC.MQOO_INQUIRE);  
 32.Net环境下操作IBM WebShpere MQ
 33.Net环境下操作IBM WebShpere MQ//本例中this.tbQName.Text=”SGS.IN.01”
 34.Net环境下操作IBM WebShpere MQ
 35.Net环境下操作IBM WebShpere MQ 
 36.Net环境下操作IBM WebShpere MQ
 37.Net环境下操作IBM WebShpere MQ                            
 38.Net环境下操作IBM WebShpere MQ
 39.Net环境下操作IBM WebShpere MQ                            this.log("Create MQQueue Sucess");
 40.Net环境下操作IBM WebShpere MQ
 41.Net环境下操作IBM WebShpere MQ 
 42.Net环境下操作IBM WebShpere MQ
 43.Net环境下操作IBM WebShpere MQ                     }

 44.Net环境下操作IBM WebShpere MQ
 45.Net环境下操作IBM WebShpere MQ                     catch(MQException ex)
 46.Net环境下操作IBM WebShpere MQ
 47