IBM MQ 5.3 FOR WIN使用文档

原创 2004年11月03日 16:24:00

MQ5.3使用手册<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

1.       基本结构

大概通讯方式是:

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

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

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

3.       A建立传输队列:

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

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

在队列名称输入一个队列的名字(该名字在以后建立发送通道时候需要使用),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中的任意一个关闭后,对方发的消息在通讯恢复正常或开机后能收到消息.其余的知识我只了解这么多了,不敢说能做出指导,只希望大家能共同进步.谢谢

利用静态数组在MQ中发送接收字符串

利用静态数组发送接收字符串,字符串长度超出数组大小时分割为多条消息 unit UMQ_PutGetPas;interfaceuses  Windows, Messages, SysUtils, Var...
  • SmartTony
  • SmartTony
  • 2008年01月22日 22:21
  • 699

IBM MQ Queue Monitor

Queue的访问方式有多种: MQOO_BROWSE:浏览,可获取其中的message,但是获取后,原有message依然存在 MQOO_INQUIRE:可以调用getCurrentDepth()...
  • wangdflx
  • wangdflx
  • 2012年12月04日 16:40
  • 1200

《WebSphereMQ基础教程》MQI笔记

一、MQI的基本数据类型 数据类型 ...
  • lujun9972
  • lujun9972
  • 2015年05月26日 07:27
  • 870

IBM MQ 5.3 FOR WIN使用文档

MQ5.3使用手册1.       基本结构大概通讯方式是:主机A的程序放一个消息在远程队列中,远程队列找相应的传输队列,传输队列找相应的发送通道,发送通道把消息放在远程服务器(主机B)的与发送通道同...
  • evscl2000
  • evscl2000
  • 2004年11月03日 16:24
  • 2224

利用静态数组和内存流在MQ中发送接收文件

unit UMQ_PutGetPas;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls...
  • itsoft2006
  • itsoft2006
  • 2007年03月15日 23:03
  • 1197

IBM MQ基本操作

IBM MQSeries使用指南   随着计算机网络和分布式应用的不断发展,远程消息传递越来越成为应用系统中不可缺少的组成部分。商业消息中间件的出现保证了消息传输的可靠性,高效率和安全性,同时也减少...
  • crazyitlhs
  • crazyitlhs
  • 2015年10月15日 16:10
  • 6089

MQ原理、使用场景、IBM WebSphere MQ介绍及spring集成配置

一、MQ简介及特点         MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专...
  • liuhaiabc
  • liuhaiabc
  • 2016年10月31日 16:54
  • 8291

GMO Internet加密挖矿设备即将启动运行

点击上方“蓝色字”可关注我们!暴走时评:日本上市IT公司GMO Internet于今年9月宣布成立挖矿业务部门,并计划于2018年第一季度投入使用。近日,GMO发布公告正式推出加密货币业务,并透露其新...
  • IJXR1A64JI53L
  • IJXR1A64JI53L
  • 2017年12月22日 00:00
  • 69

Real-time Operation System Course: 解密字符串

#include #define N 8 void decode(char original_message[], char resulting_message[]){ int i, j,...
  • rlikai
  • rlikai
  • 2015年01月18日 08:56
  • 10869

IBM MQ简单开发和应用

IBM MQ经常被一些政府公共部门,银行等企业用来做数据传输和报文收发,在互联网应用的开发中较少见到,属于一种比较老旧的应用。这里以IBM Websphere MQ 7.5版本为例介绍一下MQ的的简单...
  • lvshaorong
  • lvshaorong
  • 2017年08月15日 17:54
  • 614
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:IBM MQ 5.3 FOR WIN使用文档
举报原因:
原因补充:

(最多只允许输入30个字)