IBM MQ 5.3 FOR WIN使用文档
来源:互联网 发布:免费x站最新域名1080 编辑:程序博客网 时间:2024/05/01 08:05
MQ5.3使用手册
1. 基本结构
大概通讯方式是:
主机A的程序放一个消息在远程队列中,远程队列找相应的传输队列,传输队列找相应的发送通道,发送通道把消息放在远程服务器(主机B)的与发送通道同名的接收通道上,接收通道在把消息放在主机B的本地接受队列中,然后主机B的程序负责把消息取出来.
2. 本文示范建立一个单向的由A到B的通讯逻辑的配置过程.
顺序是: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,’连接名称’就是B的IP地址,传输队列选择刚才我们建立的传输队列,至此’传输队列QM_kfb04’已经和发送通道’ toSF’关连起来了.剩下的就是建立与’传输队列QM_kfb04’关连的’远程队列’了.在’本地通信地址’中输入A的IP地址.
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的网络链路建立完毕,同理可以建立由B到A的通讯链实现双向通讯.
9. 通讯测试
如下图打开’第一步’
进入如下界面:
选择API实验程序,启动程序如下:
点MQCONN连接A的本地队列管理器QM_sea2k,成功后如上图.
然后点’队列’选项卡,选中我们在A中设置的远程队列QRB,点MQPUT1按钮,输入一个测试消息’AAA’,然后发出.
在B上面打开WEB SPHERE MQ资源管理器,选择B上面的本地队列LQB就可以看到从A发过来的所有消息了.
10.
下面是使用MQ的C程序代码.相应的LIB文件和H文件在.C:/Program Files/IBM/WebSphere MQ/Tools/Lib/mqm.Lib
C:/Program Files/IBM/WebSphere MQ/Tools/c/include/cmqc.h
下面,当然还有一写VB和JAVA的使用例子也可以找到.
下面是本人写的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通过这些设置已经能够正常工作,本人在网络断开和A或B中的任意一个关闭后,对方发的消息在通讯恢复正常或开机后能收到消息.其余的知识我只了解这么多了,不敢说能做出指导,只希望大家能共同进步.谢谢
- IBM MQ 5.3 FOR WIN使用文档
- 安装和使用 IBM WebSphere MQ for Linux
- 安装和使用 IBM WebSphere MQ for Linux
- 安装和使用 IBM WebSphere MQ for Linux
- IBM MQ
- 常用MQ原理、使用场景和IBM WebSphere MQ介绍
- IBM-MQ安装及使用实例
- IBM-MQ原理及使用场景
- Linux下的IBM Websphere MQ Server安装测试文档
- Slony-I for Win的配置文档
- 使用IBM WEBSHPERE MQ发送大的消息
- 关于windows services里面使用在IBM MQ
- IBM MQ 使用指南
- IBM MQ 介绍
- IBM MQ介绍
- IBM MQ 使用指南
- IBM MQ 使用指南
- IBM MB MQ简介
- 吃在西安
- 石头
- linux忘记root密码,进入单用户模式修改密码
- 很久很久以前,这世界是多么的美。。。
- 加强asp学习3
- IBM MQ 5.3 FOR WIN使用文档
- 懂浪漫才浪漫
- PE插件,Struts开发好帮手
- 输在起跑点上?(转摘)
- 程序人生:大学十年——林锐
- 各种蔬菜的保存方法~~
- Jbuilder编译和创建执行文件
- test
- 最欠扁的脑筋急转弯(爆)