MQ服务消息队列介绍
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
资源简介MQ服务器端和客户端通信浅谈
1. WebSphere MQ的服务端的安装和配置
(1)创建名为venus.queue.manager的默认队列管理器。
在DOS窗口命令提示符下,输入以下命令:
crtmqm -q venus.queue.manager
(2)启动刚才创建的队列管理器。
在DOS窗口命令提示符下,输入以下命令:
strmqm venus.queue.manager
(3)启动MQSC命令。
在DOS窗口命令提示符下,输入以下命令:
runmqsc venus.queue.manager
(4)新建名为orange.queue的本地队列。
输入以下命令:
define qlocal (orange.queue)
注意:MQSC中任何小写字母将自动转换成大写,除非用单引号将它们括起来。这意味着如果使用名称Orange.Queue创建了队列,则记住在MQSC以外其他命令中都必须使用Orange.Queue。
(5)停止MQSC。
输入以下命令:
end
现在,我们已经定义了以下对象:
(1)名为venus.queue.manager的默认队列管理器。
(2)名为ORANGE.QUEUE的队列。
测试对象:要测试队列管理器和队列,请使用样本程序amqsput(将消息放入队列)和amqsget(从队列获取消息),步骤如下:
(1)启动DOS窗口,进入到C:\Program Files\IBM\WebSphere MQ\bin目录下。
(2)将消息放入队列。
输入以下命令:
amqsput ORANGE.QUEUE
显示以下消息:
Sample amqsput0 start
Target queue is ORANGE.QUEUE
(3)输入一些字符数据,然后双击"Enter"键,则显示以下消息:
Sample amqsput0 end
现在消息已经被放在队列中了。
(4)要从队列中获取消息,输入以下命令:
amqsget ORANGE.QUEUE
在屏幕上将显示您刚才输入的字符数据消息。暂停后,例子程序结束。
如果以上步骤都能完成,则完成了本地安装的验证。
注意:如果在任何阶段中断整个安装过程,则应该从头开始重新运行安装。
2. WebSphere MQ客户端的安装和配置
如果我们开发的基于MQ的应用与MQ服务器不在同一台机器上,那么就必须在MQ应用端安装MQ客户端。下面我们以在Suse Linux 10下安装WebSphere MQ v6.0 Client为例介绍MQ客户端在Linux下的安装和配置步骤。
(1)解压缩MQ客户端安装包:C84CJML.WebSphere MQ V6.0 Linux x86 Client.tar.gz,命令如下:
tar -xvfz C84CJML.WebSphere MQ V6.0 Linux x86 Client.tar.gz
(2)创建WebSphere MQ 必需的文件系统,命令如下:
mkdir /opt/mqm # for product code
mkdir /var/mqm # for working data
(3)创造MQ用户和用户组,命令如下:
groupadd mqm
useradd -d /var/mqm -g mqm -G mqm mqm
passwd mqm # change password to "password"
(4)为mqm用户组添加root组
cd /etc
vi group
修改 mqm:!:1000:mqm ? mqm:!:1000:mqm,root
(5)
调整系统参数(视需要而定)
修改最大共享内存,命令如下:
cat /proc/sys/kernel/shmmax
echo 268435456 >/proc/sys/kernel/shmmax
修改最大文件句柄,命令如下:
cat /proc/sys/fs/file-max
echo 32768 >/proc/sys/fs/file-max
(6)转到WebSphere MQ解压后的目录中,获得WebSphere MQ授权,命令如下:
./mqlicense.sh -text_only
阅读全文后,选择1接受授权。
(7)安装WebSphere MQ客户端,命令如下:
rpm -ivh MQSeriesRuntime-6.0.0-0.i386.rpm
rpm -ivh MQSeriesSDK-6.0.0-0.i386.rpm
rpm -ivh MQSeriesJava-6.0.0-0.i386.rpm
rpm -ivh MQSeriesClient-6.0.0-0.i386.rpm
rpm -ivh MQSeriesSamples-6.0.0-0.i386.rpm
(8)安装校验
rpm -qa | grep MQSeries
结果如下则表明MQ 客户端的安装已成功。
MQSeriesRuntime-6.0.0-0
MQSeriesSDK-6.0.0-0
MQSeriesJava-6.0.0-0
MQSeriesClient-6.0.0-0
MQSeriesSamples-6.0.0-0
3. WebSphere MQ的服务端和客户端的互联
本节的WebSphere MQ的服务端和客户端不在同一台机器上。
本节以上述1,2两个步骤安装好的MQ服务端和MQ客户端为例,介绍如何配置MQ的服务端和客户端使两者能够互联。
(1)服务端配置
1)点"开始"->"所有程序"->"IBM WebSphere MQ"->"WebSphere MQ 资源管理器",进入WebSphere MQ 资源管理器界面。如下图所示:
2)创建名为"QM_JACK"的队列管理器
<1>选中"队列管理器"->"新建"->"队列管理器",如下图所示:
<2>在队列管理中输入"QM_JACK",其他选项默认不变,点"下一步":
<3>设置队列日志(本步骤采用系统默认设置),点"下一步":
<4>启动队列管理器,创建服务器连接通道,允许在TCP/IP上进行队列管理器的远程管理,点击"下一步":
<5>设置队列管理器QM_JACK的侦听端口:8927(用户可以根据需要自行更改端口号),点击"完成"。
<6>系统进入等待界面:
<7>队列管理器QM_JACK创建成功
3)在QM_JACK下创建名为"QUEUE_RECV"和"QUEUE_REPLY"的本地队列(客户可以根据自己的需求随意更改本地队列的名字和数量,这里创建这两个本地队列只是为之后的MQ_Tuxedo项目作准备):
设置队列名后其他属性全为系统默认值,点击"确定"。
4)在QM_JACK下创建名为"CNN_JACK"的服务器通道。
通道名称设为CNN_JACK,其他选项保留为系统默认设置,点击"确定"。
5)在MQ服务器端的计算机用户中添加MQ客户端所在计算机的系统用户。比如我的MQ客户端被Suse Linux下的root用户使用,那么,我们就需要在MQ的服务端(也就是Windows xp系统中添加名为"root"的用户)所在的计算机系统中添加名为"root"的用户。具体步骤如下:
<1>点击"开始"->"控制面板"->"计算机管理"->"系统工具"->"
本地用户和组"->"用户",点右键,选"新用户",如下图所示:
<2>创建新用户:root(注意:这里的用户名"root"是MQ客户端所在系统的用户名,用户要根据具体情况进行修改)
随意设置一个有效密码,选中密码永不过期,点击"创建"。
<3>将新用户加入mqm组(注意:这里的mqm组是我们安装完MQ Server后系统自动创建的)
启动监听器
Runmqlsr –m QM_JACK"
设置
export MQCHLTAB= /PTAH/AMQCLCHL.TAB
重启机器。至此,MQ服务端的配置完成。
(2)客户端配置
按照我们前面的步骤,MQ客户端是安装在Suse Linux 10 上,所以本节以Suse Linux 10下的MQ Client v6为例说明如何配置MQ客户端才能连上MQ服务器。
1)设置MQSERVER环境变量,命令如下:
export MQSERVER='CNN_JACK/tcp/9.186.110.133(8927)'
参数说明:
服务器连接通道名称:CNN_JACK
服务器连接通道协议类型:tcp
服务器IP地址:9.186.110.133
服务器连接通道所在的队列管理器QM_JACK的侦听端口:8927
2)测试客户端与服务端的网络连接
在客户端使用ping命令检查客户端是否能连上服务端机器。
同样,在服务端使用ping命令检查服务端是否能连上客户端机器。
测试完成后,进入下一步。
3)进入/opt/mqm/samp/bin,使用样本程序amqsputc(用来将消息发送到服务端队列)和amqsgetc(用来从服务端队列中读取消息)来测试客户端与服务端的MQ连接是否畅通,具体步骤如下:
<1>输入命令:
./amqsputc QUEUE_RECV QM_JACK
则会显示以下消息:
Sample AMQSPUT0 start
target queue is QUEUE_RECV
<2>输入一些字符,然后双击"Enter"键,则显示如下信息:
Sample AMQSPUT0 end
<3>要从队列获取消息,则输入如下命令:
./amqsgetc QUEUE_RECV QM_JACK
则会在屏幕上打印出刚才输入的字符数据消息。暂停后,;例子程序结束。
如果以上步骤都能够完成,则完成了MQ服务端和客户端的互联配置。
注意:有时候,MQ客户端联服务端时会因为两端字符集编码CCSID不一样造成连接的失败,典型错误是:MQCONN ended with reason code 2059。在队列管理器的错误日志(位于/var/mqm/errors/AMQERROR**.log)中有如下信息:
-------------------------------------------------------------------------------
08/23/2002 11:51:48
AMQ9541: CCSID supplied for data conversion not supported.
EXPLANATION:
The program ended because,
either the source CCSID '437' or the target CCSID '1381' is not valid,
or is not currently supported.
ACTION:
Correct the CCSID that is not valid, or ensure that the requested CCSID can be supported.
解决方法如下:在服务端用runmqsc qmname命令,输入dis qmgr查看CCSID属性值n
nnn,在客户端上配置环境变量: Windows 下:set MQCCSID=nnnn(在服务端看到的CCSID), Linux下:export MQCCSID=nnnn(在服务端看到的CCSID),重新启动MQ 客户端机器即可。
---------------------------------------------------------------------------------------
Solaris10 配置WebSphere MQ 服务自动启动(转)
由于工作的需要,最近一直再搞IBM WebSphere MQ;包括MQ的优化,开发,集成...
以及各个平台下MQ的安装,配置,调试等等...
跨操作系统下MQ的通讯,异操作系统下Java和C#对MQ的互收发分包大消息的测试等等...
测试的操作系统有:[Winods XP],[Windows 7],[Fedora 10],[RedHat Enterprise 5.3],[Solaris 10]下的测试;
Linux下MQ的安装(RedHat5.3安装很顺利,Fedora 10下需要下载一些rpm包,Ubuntu8测试时需要安装的组件太多,不妨说Ubuntu系统太烂,不适合做Server)
Unix(Solaris 10下安装MQ相对比较轻松,创建mqm组和mqm用户,解压安装即可,可惜Solaris下没有可视化界面)
安装玩MQ之后,Windos和Linux的操作几乎都一样;但Linux、Solaris下的MQ默认是没有自动随系统启动的,先前查阅了一些资料都没有介绍在Linux、Unix(Solaris)下怎样设置MQ队列管理器随系统自动启动,索性自己来搞了。
1.新建此/etc/init.d/startmqm文件:
#!/bin/sh
# chkconfig: 35 110 20
# description: MQManager auto start-stop script.
MGR_NAME=MQ_000000
MQ_OWNER=mqm
case "$1" in
'start')
# Start the MQManager:
# The following command assumes that the mqm login
# will not prompt the user for any values
su - $MQ_OWNER -c "/opt/mqm/bin/strmqm $MGR_NAME"
;;
'stop')
# Stop the MQManager:
# The following command assumes that the mqm login
# will not prompt the user for any values
su - $MQ_OWNER -c "/opt/mqm/bin/endmqm $MGR_NAME"
;;
esac
======================================================
在Unix(Solaris10下此属性无效)chkconfig(RedHat5)
chkconfig: 35 110 20
允许级别为3、5,启动优先级为110,停止优先级为20
-----------------
运行级别:
运行级就是操作系统当前正在运行的功能级别。这个级别从1到6 ,具有不同的功能。
不同的运行级定义如下
# 0 -停机
# 1 -单用户模式# s init s = init 1
# 2 - 多用户,没有 NFS
# 3 -完全多用户模式(标准的运行级)
# 4 -没有用到
# 5 - X11多用户图形模式(xwindow)
# 6 -重新启动
2.给此启动文件赋予权限
chmod 755 /etc/init.d/startmqm
3.设置启动关联
ln -s /etc/init.d/startmqm /etc/rc3.d/S110startmqm
ln -s /etc/init.d/startmqm /etc/rc5.d/S110startmqm
ln -s /etc/init.d/startmqm /etc/rc0.d/K20startmqm
--------------------------------------------------
S110startmqm
S为start;110为优先级;
=====================
rc0.d/K20startmqm
停止时,K为kill,20为停止优先级
-----------------------------------------------
----------------------------
本文将通过用于向队列发送消息和从队列接收消息的示例应用程序说明如何在 Linux 上着手安装和配置 WebSphere MQ,以及如何为 MQ 环境开发 Java 应用程序。
引言
本文的目标是让您轻松实现 Linux? 上的 IBM? Websphere? MQ 入门。由于大部分 Linux 服务器并没有图形用户界面,因此本文将说明如何使用命令行工具在 Linux 上安装和配置 Websphere MQ。本文将说明如何使用 Websphere MQ Java API 创建两个示例 Java? 应用程序:MQSend(用于向队列发送消息)和 MQGet(用于从队列接收消息)。
先决条件
Websphere MQ V6 安装包。
一台或两台安装了 Linux 的计算机。本文使用两台安装了 Suse Linux Enterprise Server V9 的计算机,不过也可以在一台计算机上完成所有工作。
Linux 管理技能。
Java 开发方面的经验将有所帮助,但并非必须的,因为我们提供了经过预编译的 Java 示例应用程序供下载和在命令行使用。
Websphere MQ
Websphere MQ 提供了连接层和应用程序的可靠集成,为 SOA 提供了所需的基础。Websphere MQ 的主要特色功能包括:
有保证的消息交付
基于可靠队列的消息传递,可确保消息不会丢失或重复。
基于标准的开发
使用 Java Message Service (JMS) API 和 Message Queue Interface (MQI)。
端到端安全
使用安全套接字层(Secure Sockets Layer,SSL)进行身份验证、消息完整性检查和数据加密。
Web 服务支持
用于保证 Web 服务传输和可靠性的简单对象访问协议(Simple Object Access Protocol,SOAP)。
异步处理
对应用程序进行分离,以支持进行独立于时间的处理。
多平台支持
支持 80 种以上的配置。
有关 Websphere MQ 的更多信息,请参见本文结尾的参考资料。
安装 Websphere MQ
安装 Websphere MQ 的过程非常简单——直接将安装包释放到目录中即可(本文使用 root 主目录下的 mq_install)。可以安装 RPM 安装包中的所有内容,但本文仅需要这部分东西。以下是 Websphere MQ V6 中包括的包和目录:
IBMJava2-SDK-1.4.2-0.0.i386.rpm
MQSeriesClient-6.0.0-0.i386.rpm
MQSeriesConfig-6.0.0-0.i386.rpm
MQSeriesFTA-6.0.0-0.i386.rpm
MQSeriesIES30-6.0.0-0.i386.rpm
MQSeriesJava-6.0.0-0.i386.rpm
MQSeriesKeyMan-6.0.0-0.i386.rpm
MQSeriesMan-6.0.0-0.i386.rpm
MQSeriesMsg_Zh_CN-6.0.0-0.i386.rpm
MQSeriesMsg_Zh_TW-6.0.0-0.i386.rpm
MQSeriesMsg_de-6.0.0-0.i386.rpm
MQSeriesMsg_es-6.0.0-0.i386.rpm
MQSeriesMsg_fr-6.0.0-0.i386.rpm
MQSeriesMsg_it-6.0.0-0.i386.rpm
MQSeriesMsg_ja-6.0.0-0.i386.rpm
MQSeriesMsg_ko-6.0.0-0.i386.rpm
MQSeriesMsg_pt-6.0.0-0.i386.rpm
MQSeriesRuntime-6.0.0-0.i386.rpm
MQSeriesSDK-6.0.0-0.i386.rpm
MQSeriesSamples-6.0.0-0.i386.rpm
MQSeriesServer-6.0.0-0.i386.rpm
MQSeriesTXClient-6.0.0-0.i386.rpm
PreReqs
READMEs
copyright
gsk7bas-7.
0-3.15.i386.rpm
lap
licenses
下面是安装步骤:
设置 Linux 服务器。本文使用主机名 WMQ1 和 WMQ2。WMQ1 的 IP 地址为 192.168.28.71,WMQ2 的 IP 地址为 192.168.28.72。
安装 Websphere MQ 前,必须执行 ./mqlicense.sh,以阅读和接受许可证。
安装所需的 MQ 包及 Websphere MQ Java 和 IBM Java SDK 包,以便为 Websphere MQ 开发 Java 客户机: wmq1:~/mq_install # rpm -ivh IBMJava2-SDK-1.4.2-0.0.i386.rpm
wmq1:~/mq_install # rpm -ivh MQSeriesRuntime-6.0.0-0.i386.rpm
wmq1:~/mq_install # rpm -ivh MQSeriesServer-6.0.0-0.i386.rpm
wmq1:~/mq_install # rpm -ivh MQSeriesJava-6.0.0-0.i386.rpm
Websphere MQ 现在已经完成安装,并有用于进行配置的名为 mqm 的用户和组。缺省情况下,Websphere MQ 安装在 /opt/mqm 中,队列和其他配置信息位于用户 mqm 的主目录中。Java SDK 安装在 /opt/IBMJava2-142 中,Java 解释程序位于 /opt/IBMJava2-142/bin 中。
下一步是进行配置。本文为两台计算机使用了具有本地和远程队列的单个队列管理器,用于测试示例应用程序。
配置 Websphere MQ
Websphere MQ 术语和定义
队列管理器
提供队列服务和 API 及用于管理队列的管理功能的系统管理程序。
队列
消息所发送到的命名目的地。
本地队列
位于队列管理器本地的队列。
远程队列
驻留在其他队列管理器(可能位于其他主机上)的队列。
传输队列
以远程队列为目标的临时消息队列。
通道
队列管理器之间的通信路径。
侦听器
从客户机或其他队列管理器接受网络请求。
命令服务器
验证命令并将有效命令发送到命令处理器(后者随后执行命令)。
配置过程包括以下几个步骤:
创建队列管理器。
启动队列管理器。
创建队列和通道。
启动命令服务器、侦听器和通道。
两台 Websphere MQ 计算机都需要执行这些步骤。下面的部分将仅说明如何在 WMQ1 上进行配置,但在 WMQ2 上也需要进行这些步骤。
创建并启动队列管理器
使用 root 登录到 WMQ1,然后键入 su - mqm,以更改到用户 mqm。使用以下命令为 WMQ1 计算机创建队列管理器:
mqm@wmq1:~/ # crtmqm WMQ1QM
使用以下命令启动队列管理器。
mqm@wmq1:~/ # strmqm WMQ1QM
创建队列和通道
使用命令行工具配置 Websphere MQ。以下给出了 WMQ1 的配置脚本。此脚本定义本地队列、远程队列、传输队列、发送方通道和接收方通道。将以下脚本保存为 WMQ1QM.conf:
DEFINE QLOCAL ('WMQ1InputQ') +
REPLACE
DEFINE QLOCAL ('WMQ2QMXmitQ') +
DESCR('Transmission Queue to WMQ2QM') +
USAGE(XMITQ) +
TRIGGER +
TRIGTYPE(FIRST) +
TRIGDPTH(1) +
TRIGDATA('WMQ1QM.WMQ2QM') +
INITQ('SYSTEM.CHANNEL.INITQ') +
REPLACE
DEFINE QREMOTE ('WMQ1OutputQ') +
X
MITQ('WMQ2QMXmitQ') +
RNAME('WMQ2InputQ') +
RQMNAME('WMQ2QM') +
REPLACE
DEFINE CHANNEL ('WMQ1QM.WMQ2QM') CHLTYPE(SDR) +
TRPTYPE(TCP) +
CONNAME('192.168.28.72(1414)') +
XMITQ('WMQ2QMXmitQ') +
REPLACE
DEFINE CHANNEL ('WMQ2QM.WMQ1QM') CHLTYPE(RCVR) +
TRPTYPE(TCP) +
REPLACE
DEFINE CHANNEL ('SYSTEM.ADMIN.SVRCONN') CHLTYPE(SVRCONN) +
TRPTYPE(TCP) +
DESCR(' ') +
HBINT(300) +
MAXMSGL(4194304) +
MCAUSER('MUSR_MQADMIN') +
RCVDATA(' ') +
RCVEXIT(' ') +
SCYDATA(' ') +
SCYEXIT(' ') +
SENDDATA(' ') +
SENDEXIT(' ') +
REPLACE
上面的配置脚本可作为其他 Websphere MQ 安装的模版使用。只需要更改粗体部分的名称,即可在其他 Websphere MQ 安装中设置队列和通道。此配置脚本中包含大量条目——有关它们的更多信息,请参见 Websphere MQ 信息中心。
使用以下命令创建队列和通道,以配置 Websphere MQ:
mqm@wmq1:~/ # runmqsc WMQ1QM < WMQ1QM.conf > qcreate.log
runmqsc 命令用于发出 Websphere MQ 命令。在本例中,这些命令从 WMQ1QM.conf 文件读取,而输出被定向到 qcreate.log。打开 qcreate.log,验证其中不存在语法错误,全部有效命令均得到了处理。
启动服务
需要启动命令服务器、侦听器和通道,然后就可以进行示例应用程序的部署和测试工作了。
mqm@wmq1:~/ # strmqcsv WMQ1QM &
mqm@wmq1:~/ # runmqlsr -m WMQ1QM -t TCP &
验证队列管理器和侦听器在两台计算机上运行,然后启动通道:
mqm@wmq1:~/ # runmqchl -m WMQ1QM -c WMQ1QM.WMQ2QM &
mqm@wmq1:~/ # runmqchl -m WMQ1QM -c WMQ2QM.WMQ1QM &
现在已经安装了 Websphere MQ,并进行了配置,已准备好可以进行测试了。下面一部分将给出两个基于 Java 的应用程序的源代码,分别用于向队列发送消息和从队列接收消息。
示例应用程序
用于将消息放入队列中 (MQSend) 和从队列获取消息 (MQGet) 的示例 Java 应用程序可使用前面部分中定义的队列。这些应用程序支持 String 消息,旨在用于测试和作为说明如何从 Java 应用程序使用 Websphere MQ 的示例。可以从脚本使用应用程序,包括各种类型的应用程序。MQSend 和 MQGet 都从 MQConnector 类进行扩展,该类可提供 Websphere MQ 连接、初始化 Websphere MQ、打开和关闭队列,向队列发送消息及从队列接收消息。
MQConnector
MQConnector 是用于进行发送和获取操作的超类。该类处理打开连接和发送及获取消息的工作。将使用属性文件对其进行配置,需要在属性文件中指定主机地址、队列管理器名称和队列名称:
queue.manager=WMQ1QM
queue.manager.host=192.168.28.71
=WMQ1OutputQ
以下是 MQConnector 源代码:
package mqconn;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOExceptio
n;
import java.util.Properties;
import com.ibm.mq.MQC;
import com.ibm.mq.MQEnvironment;
import com.ibm.mq.MQException;
import com.ibm.mq.MQGetMessageOptions;
import com.ibm.mq.MQMessage;
import com.ibm.mq.MQPutMessageOptions;
import com.ibm.mq.MQQueue;
import com.ibm.mq.MQQueueManager;
public class MQConnector
{
protected String qManager = ""; // define name of queue manager
protected String qManagerHost = "";
protected String queuName = ""; // define name of queue
protected MQQueue mqQueue;
protected MQQueueManager qMgr;
public static boolean DEBUG = true;
public MQConnector()
{
}
public void initMq()
{
try
{
FileInputStream fis = new FileInputStream(new File("mqconnect.properties"));
Properties props = new Properties();
props.load(fis);
fis.close();
qManager = props.getProperty("queue.manager");
qManagerHost = props.getProperty("queue.manager.host");
queuName = props.getProperty("");
// Create a connection to the queue manager
MQEnvironment.channel = "SYSTEM.DEF.SVRCONN";
MQEnvironment.hostname = qManagerHost;
debug("Connecting to QueueManager " + qManager + " on " + qManagerHost);
qMgr = new MQQueueManager(qManager);
}
catch (Exception e)
{
e.printStackTrace();
}
}
public void openQueue() throws MQException
{
// Set up the options on the queue we wish to open...
// Note. All Websphere MQ Options are prefixed with MQC in Java.
int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT;
// Now specify the queue that we wish to open,
// and the open options...
debug("Opening queue: " + queuName);
try
{
mqQueue = qMgr.accessQueue(queuName, openOptions);
}
catch(MQException mqe)
{
//check if MQ reason code 2045
//means that opened queu is remote and it can not be opened as
//input queue
//try to open as output only
if(mqe.reasonCode==2045)
{
openOptions = MQC.MQOO_OUTPUT;
mqQueue = qMgr.accessQueue(queuName, openOptions);
}
}
}
public void putMessageToQueue(String msg) throws MQException
{
try
{
debug("Sending message: " + msg);
MQPutMessageOptions pmo = new MQPutMessageOptions();
MQMessage mqMsg = new MQMessage();
mqMsg.write(msg.getBytes());
// put the message on the queue
mqQueue.put(mqMsg, pmo);
}
catch (IOException e)
{
e.printStackTrace();
}
}
public String getMessageFromQueue() throws MQException
{
try
{
MQMessage mqMsg = new MQMessage();
MQGetMessageOptions gmo = new MQGetMessageOptions();
// Get a message from the queue
mqQueue.get(mqMsg,gmo);
//Extract the message data
int len=mqMsg.getDataLength();
byte[] messa
ge = new byte[len];
mqMsg.readFully(message,0,len);
return new String(message);
}
catch(MQException mqe)
{
int reason=mqe.reasonCode;
if(reason==2033)//no messages
{
return null;
}
else
{
throw mqe;
}
}
catch (IOException e)
{
e.printStackTrace();
return null;
}
}
public void closeQueue() throws MQException
{
debug("Closing queue and disconnecting QueueManager...");
// Close the queue...
mqQueue.close();
// Disconnect from the queue manager
qMgr.disconnect();
}
protected boolean hasArg(String arg, String[] args)
{
for(int i=0;i
if(args[i].equals(arg))
{
return true;
}
}
return false;
}
public void debug(Object msg)
{
if (DEBUG)
{
System.out.println(msg);
}
}
}
该类向其他应用程序提供 Websphere MQ 功能。还可以在自己的应用程序中将 MQConnector 作为其他类的超类或实用类使用。以下方法为 Java 应用程序提供消息传递功能:
initMQ()
读取属性并创建队列管理器对象。
openQueue()
打开属性文件中指定的队列。
closeQueue()
关闭已打开的队列。
disconnectMq()
断开队列管理器。
putMessageToQueue(String)
将字符串消息放置到指定的队列。
getMessageFromQueue()
从指定的队列读取字符串消息。
MQSend
MQSend(如下所示)将使用 MQConnector 类,是用于向队列发送消息的命令行程序。消息作为命令行参数指定,可以使用其将文件内容作为消息发送:
package mqconn;
import java.io.BufferedReader;
import java.io.FileReader;
import com.ibm.mq.MQException;
public class MQSend extends MQConnector
{
public MQSend()
{
}
public void send(String[] args) throws MQException
{
boolean argsAreFiles = hasArg("-f", args);
initMq();
openQueue();
for (int i = 0; i < args.length; i++)
{
if (args[i].equals("-f"))
continue;
if (!argsAreFiles)
{
putMessageToQueue(args[i]);
}
else
{
try
{
// send file contents as message
BufferedReader br = new BufferedReader(new FileReader(args[i]));
StringBuffer msg = new StringBuffer();
for (String line = br.readLine(); line != null; line = br.readLine())
{
msg.append(line);
msg.append('n');
}
br.close();
putMessageToQueue(msg.toString());
}
catch (Exception e)
{
System.out.println("Error while processing file " + args[i] + ": "
+ e.toString());
}
}
System.out.println("Message sent.");
}
closeQueue();
discon
nectMq();
}
public static void main(String[] args)
{
MQSend mqsend = new MQSend();
MQConnector.DEBUG = false;
try
{
if (args == null || args.length == 0)
{
System.out.println("Usage: " + mqsend.getClass().getName()
+ " [-f]
System.exit(0);
}
mqsend.send(args);
}
catch (Exception e)
{
System.out.println(e.toString());
System.out.println("Usage: " + mqsend.getClass().getName()
+ " [-f]
}
}
}
MQSend 使用 MQConnector 提供消息传递,实际的 MQSend 程序功能非常简单。它有两种操作模式:
将每个命令行参数作为独立消息传递。
使用 -f 选项发送文件内容。在本例中,每个命令行参数都是文件名。
MQGet
MQGet 类(如下所示)非常简单——从指定的队列检索消息,并将其写入到标准输出。可以通过使用重定向将消息存储在文件中。
package mqconn;
import com.ibm.mq.MQException;
public class MQGet extends MQConnector
{
public MQGet()
{
}
public String getMessages(String[] args) throws MQException
{
String message=getMessageFromQueue();
return message;
}
public static void main(String[] args)
{
MQGet mqget = new MQGet();
MQConnector.DEBUG=false;
try
{
mqget.initMq();
mqget.openQueue();
String msg=mqget.getMessages(args);
if(msg!=null)
{
System.out.println(msg);
}
mqget.closeQueue();
mqget.disconnectMq();
}
catch (Exception e)
{
e.printStackTrace();
System.out.println("Usage: "+mqget.getClass().getName()+" ");
}
}
}
MQGet 使用 mqconnect.properties 文件中指定的队列管理器和队列。下一部分将给出一些可供进行测试的示例用例。
示例用例
以下是一些用例,均使用 WMQ1 作为发送方,WMQ2 作为接收方,说明了如何使用 MQSend 和 MQGet 应用程序。
准备工作
在使用示例前,您需要进行一些准备工作,如设置属性和编写一些 Helper 脚本等。为 WMQ1 中的 MQSend 应用程序使用以下属性:
queue.manager=WMQ1QM
queue.manager.host=127.0.0.1
=WMQ1OutputQ
为 WMQ2 中的 MQGet 应用程序使用以下属性:
queue.manager=WMQ2QM
queue.manager.host=127.0.0.1
=WMQ2InputQ
为了节约键入的时间,以下提供了用于进行发送和接收的两个脚本。
/opt/IBMJava2-142/bin/java -cp .:com.ibm.mq.jar mqconn.MQSend "$@"
/opt/IBMJava2-142/bin/java -cp .:com.ibm.mq.jar mqconn.MQGet "$@"
使用 chmod 755 mqsend 和 chmod 755 mqget 将这些脚本转换为可执行文件。本文中的所有类和文件都位于 /var/mqm/b
in 目录中,其中 /var/mqm 是 mqm 用户的主目录。
命令
第一个示例命令将消息发送到上面指定的队列。下面的示例清单给出了实际的命令,另外还给出了命令的输出。
mqm@wmq1:~/bin> ./mqsend "This is test message"
MQJE001: Completion Code 2, Reason 2045
Message sent.
MQJE001 是预期出现的内容。Reason 2045 表示在本例中无法将要打开的队列作为输入队列打开,因为此队列是远程队列。MQJE001 由 Websphere MQ 类输出到标准错误。如果不希望看到这些错误消息,请将标准错误重新定向到 /dev/null ./mqsend "This is test message" 2> /dev/null。若要了解原因代码的含义,请使用 mqrc 2045。
在 WMQ2 上,使用 mqget 命令接收消息:
mqm@wmq2:~/bin> ./mqget
This is test message
如果再次执行 mqget,会看到预期的 MQJE001 消息。mqrc 2033 中的 2033 表示“MQRC_NO_MSG_AVAILABLE”。检索消息并将其从队列删除。以下代码说明了如何发送多个消息:
mqm@wmq1:~/bin> ./mqsend "This is test message" This is another message
MQJE001: Completion Code 2, Reason 2045
Message sent.
Message sent.
Message sent.
Message sent.
Message sent.
接收消息与上面所示的 mqget 命令相同。以下代码说明了如何接收多个消息:
mqm@wmq2:~/bin> ./mqget
This is test message
mqm@wmq2:~/bin> ./mqget
This
mqm@wmq2:~/bin> ./mqget
is
mqm@wmq2:~/bin> ./mqget
another
mqm@wmq2:~/bin> ./mqget
message
mqm@wmq2:~/bin> ./mqget
MQJE001: Completion Code 2, Reason 2033
下一个示例将发送所有 Java 文件的内容:
mqm@wmq1:~/bin> ls -1 mqconn/*.java | awk '{print "mqsend -f """}' | sh 2> /dev/null
Message sent.
Message sent.
Message sent.
下一个示例读取消息并将其保存到文件中:
mqm@wmq2:~/bin> ./mqget > msg1.txt
mqget 命令的输出被定向到 msg1.txt。
结束语
本文说明了 Linux 上的 Websphere MQ 使用入门知识。只需要进行一些安装和配置步骤,就能让 Websphere MQ 正常运行,而这些步骤正是了解 Websphere MQ 的更多信息的良好起点。文中提供的示例应用程序说明了可以如何方便地获取对 Websphere MQ 及消息传递功能的访问。示例应用程序还可作为开发自定义应用程序的不错借鉴。