CSDN博客

img evscl2000

IBM MQ 5.3 FOR WIN使用文档

发表于2004/11/3 16:24:00  2151人阅读

MQ5.3使用手册

1.       基本结构

大概通讯方式是:

主机A的程序放一个消息在远程队列中,远程队列找相应的传输队列,传输队列找相应的发送通道,发送通道把消息放在远程服务器(主机B)的与发送通道同名的接收通道上,接收通道在把消息放在主机B的本地接受队列中,然后主机B的程序负责把消息取出来.

2.       本文示范建立一个单向的由AB的通讯逻辑的配置过程.

顺序是:A建立传输队列--A建立发送通道--A建立远程队列—B建立本地接收方通道—B建立本地接收队列修改A的传输队列加入自启动功能.

3.       A建立传输队列:

传输队列在系统中启到连接下层发送通道和上层远程队列的作用. 打开主机A上的’WebSphere MQ 资源管理器’,如下图操作

在队列名称输入一个队列的名字(该名字在以后建立发送通道时候需要使用),IBM建议传输队列的名称和B上面的队列管理器同名,B上的队列管理器名字为QM_kfb04,所以这里输入QM_kfb04.由于需要,我在缺省持久性里选择了持久’,因为我所开发的项目数据传输不能丢失.’用法上一定要选择传输,说明这个队列是个传输队列.

其余的设置如图.

 

4.       A上建立到B的发送通道:

在通道名称中输入一个通道的名称,其名称必须和B上的接收通道的名字相同,B上的接收通道名字是’ toSF’,这里写入’ toSF’,协议选择TCP/IP,’连接名称就是BIP地址,传输队列选择刚才我们建立的传输队列,至此传输队列QM_kfb04’已经和发送通道’ toSF’关连起来了.剩下的就是建立与传输队列QM_kfb04’关连的远程队列.本地通信地址中输入AIP地址.

          

5.       A上建立到B的远程队列QRB,当程序需要和B通信时就把消息放到该队列中,如下图建立远程队列.远程队列管理器名称中输入B的队列管理器的名字’ QM_kfb04’,传输队列名称中选择3中建立的传输队列(至此:通道--传输队列远程队列的关系建立完毕).远程队列名称中输入B本地队列的名字LQB,B的上程序可以直接在LQB里取出从A上放入的消息.


6.       B上建立本地接受通道toSF(4中要求的通道同名)

 

7.       B上建立本地接受队列LQB,该名称要和5中要求的远程队列名称相同.B上的程序可以通过LQB取出从A发过来的消息.


8.       在A上把传输队列设为自启动.

 

至此一个由系统A到系统B的网络链路建立完毕,同理可以建立由BA的通讯链实现双向通讯.

9.       通讯测试

如下图打开第一步

进入如下界面:

 

选择API实验程序,启动程序如下:


MQCONN连接A的本地队列管理器QM_sea2k,成功后如上图.

然后点队列选项卡,选中我们在A中设置的远程队列QRB,MQPUT1按钮,输入一个测试消息’AAA’,然后发出.

 

B上面打开WEB SPHERE MQ资源管理器,选择B上面的本地队列LQB就可以看到从A发过来的所有消息了.

 

 

 

 


 

10.   下面是使用MQC程序代码.相应的LIB文件和H文件在.

C:/Program Files/IBM/WebSphere MQ/Tools/Lib/mqm.Lib

C:/Program Files/IBM/WebSphere MQ/Tools/c/include/cmqc.h

下面,当然还有一写VBJAVA的使用例子也可以找到.

下面是本人写的C的测试代码:

 

VC里面的关键代码

发送程序:A打开本地队列管理器QM_sea2k,然后发送一个ilove消息到远程队列QRB

#include "testmq.h"

#include "cmqc.h"

 

void CMainFrame:: OnSentMyMes ()

{

MQHCONN Hcon;

MQLONG CompCode;

MQLONG Reason;

char QMName[50];

strcpy(QMName,"QM_sea2k");

MQCONN(QMName,&Hcon,&CompCode,&Reason);

if(CompCode == MQCC_FAILED)

{

        MessageBox("fail");

        return;

}

MQHOBJ   Hobj;

MQOD od = {MQOD_DEFAULT};

MQLONG O_options;

strcpy(od.ObjectName,"QRB");

O_options = MQOO_OUTPUT + MQOO_FAIL_IF_QUIESCING;

MQOPEN(Hcon,&od,O_options,&Hobj,&CompCode,&Reason);

if (Reason != MQRC_NONE)

{

        MessageBox("open queqe fail");

        return;

}

 

 

   MQMD     md = {MQMD_DEFAULT};    /* Message Descriptor            */

   MQPMO   pmo = {MQPMO_DEFAULT};   /* put message options           */

   memcpy(md.Format,           /* character string format            */

          MQFMT_STRING, (size_t)MQ_FORMAT_LENGTH);

   memcpy(md.MsgId,           /* reset MsgId to get a new one    */

              MQMI_NONE, sizeof(md.MsgId) );

 

   memcpy(md.CorrelId,        /* reset CorrelId to get a new one */

              MQCI_NONE, sizeof(md.CorrelId) );

 

   char     buffer[100]; 

   MQLONG   messlen;                /* message length received       */

messlen = 6;

strcpy(buffer,"ilove");

   memcpy(md.MsgId,           /* reset MsgId to get a new one    */

              MQMI_NONE, sizeof(md.MsgId) );

 

       memcpy(md.CorrelId,        /* reset CorrelId to get a new one */

              MQCI_NONE, sizeof(md.CorrelId) );

 

       MQPUT(Hcon,                /* connection handle               */

             Hobj,                /* object handle                   */

             &md,                 /* message descriptor              */

             &pmo,                /* default options (datagram)      */

             messlen,             /* message length                  */

             buffer,              /* message buffer                  */

             &CompCode,           /* completion code                 */

             &Reason);            /* reason code                     */

 

       /* report reason, if any */

       if (Reason != MQRC_NONE)

       {

         printf("MQPUT ended with reason code %d/n", Reason);

       }

 

 

 

 

 

MQLONG   co = MQCO_NONE;

MQCLOSE(Hcon,&Hobj,co,&CompCode,&Reason);

}

 

B接受消息的程序:从本地队列管理器QM_kfb04的本地队列LQA接收消息A传过来的消息ilove

void CMainFrame::OnGetMyMes()

{

MQHCONN Hcon;

MQLONG CompCode;

MQLONG Reason;

char QMName[50];

strcpy(QMName," QM_kfb04");

MQCONN(QMName,&Hcon,&CompCode,&Reason);

if(CompCode == MQCC_FAILED)

{

        MessageBox("fail");

        return;

}

MQHOBJ   Hobj;

MQOD od = {MQOD_DEFAULT};

MQLONG O_options;

strcpy(od.ObjectName,"LQB");

O_options = MQOO_INPUT_AS_Q_DEF + MQOO_FAIL_IF_QUIESCING;

MQOPEN(Hcon,&od,O_options,&Hobj,&CompCode,&Reason);

if (Reason != MQRC_NONE)

{

        MessageBox("open queqe fail");

        return;

}

 

 

   MQMD     md = {MQMD_DEFAULT};    /* Message Descriptor            */

   MQGMO   gmo = {MQGMO_DEFAULT};   /* get message options           */

 md.Encoding       = MQENC_NATIVE;

     md.CodedCharSetId = MQCCSI_Q_MGR;

 MQBYTE   buffer[101];            /* message buffer                */

   MQLONG   buflen;                 /* buffer length                 */

   MQLONG   messlen;                /* message length received       */

 

 

   gmo.Options = MQGMO_WAIT       /* wait for new messages           */

               + MQGMO_CONVERT;   /* convert if necessary            */

   gmo.WaitInterval = 15000; 

   buflen = sizeof(buffer) - 1; /* buffer size available for GET   */

     memcpy(md.MsgId, MQMI_NONE, sizeof(md.MsgId));

     memcpy(md.CorrelId, MQCI_NONE, sizeof(md.CorrelId));

     md.Encoding       = MQENC_NATIVE;

     md.CodedCharSetId = MQCCSI_Q_MGR;

  

   MQGET(Hcon,                /* connection handle                 */

           Hobj,                /* object handle                     */

           &md,                 /* message descriptor                */

           &gmo,                /* get message options               */

           buflen,              /* buffer length                     */

           buffer,              /* message buffer                    */

           &messlen,            /* message length                    */

           &CompCode,           /* completion code                   */

           &Reason);            /* reason code                       */

 

     /* report reason, if any     */

     if (Reason != MQRC_NONE)

     {

       if (Reason == MQRC_NO_MSG_AVAILABLE)

       {                         /* special report for normal end    */

         printf("no more messages/n");

       }

       else                      /* general report for other reasons */

       {

         printf("MQGET ended with reason code %d/n", Reason);

 

         /*   treat truncated message as a failure for this sample   */

         if (Reason == MQRC_TRUNCATED_MSG_FAILED)

         {

           CompCode = MQCC_FAILED;

         }

       }

     }

 

     /****************************************************************/

     /*   Display each message received                              */

     /****************************************************************/

     if (CompCode != MQCC_FAILED)

     {

       buffer[messlen] = '/0';            /* add terminator          */

       printf("message <%s>/n", buffer);

  

   MessageBox((char*)buffer);

}

 

大体上IBM MQ 5.3通过这些设置已经能够正常工作,本人在网络断开和AB中的任意一个关闭后,对方发的消息在通讯恢复正常或开机后能收到消息.其余的知识我只了解这么多了,不敢说能做出指导,只希望大家能共同进步.谢谢

阅读全文
0 0

相关文章推荐

img
取 消
img