Websphere MQ是IBM的商业消息中间件(Commercial Messaging Middleware)。Websphere MQ提供一个具有工业标准、安全、可靠的消息传输系统。它的功能是控制和管理一个集成的商业应用,使得组成这个商业应用的多个分支程序(模块)之间通过传 递消息完成整个工作流程。Websphere MQ基本由一个消息传输系统和一个应用程序接口组成,其资源是消息和队列(Messaging and Queuing)。
消息:消息就是一个信息单元,这个信息单元可以是一个请求(Request message),也可以是一个应答(Reply message),或者是一个报告(Report message)或一份报文(Datagram messge)。一个消息包含两个因素——消息描述(用于定义诸如消息传输目标等)和数据消息(如应用程序数据或数据库查询等)。程序之间的通信通过传 递消息而非直接调用程序。
队列:一个安全的存储消息的地方,消息的存储一般是顺序的,队列是消息分阶段地传送和接收。因为消息存放在队列中,所以应用程序可以相互独立的运行,以不 同的速度,在不同的时间,在不同的地点。
消息传输系统:用于确保队列之间的消息提供,包括网络中不同系统上的远程队列之间的消息提供。并保证网络故障或关闭后的恢复。
应用程序接口:应用程序和消息系统之间通过Websphere MQ API实现的接口Websphere MQ API在所有Websphere MQ平台上是一致的。API只有14个调用,2个关键动词:发送(PUT)和接收(GET)。
IBM Websphere MQ 保证了消息可靠性传输及只传递一次(once and only once)的特点
安装环境
WebSphere MQ 不支持含有空格的主机名,如果将MQ 安装在主机名包含空格的主机上,MQ将不能创建队列管理器(queue managers)
硬件要求
Websphere MQ for Linux,Version 6.0(x86 platform) 支持任何X86平台架构的主机
最低要求
512MB RAM
1GHZ CPU
1.5G的硬盘空间
1024*768的显示器
支持的操作系统
目前支持Red Hat Enterprise Linux AS V3.0 V4.0
SuSE Linux Enterprise Server (SLES)V8 SP3,V9
注意:目前SuSE8不支持MQ Explorer 图形接口
硬盘空间要求
MQ所需的空间按照安装的组件的多少及队列消息存储的长短来定制
例如:
安装Runtime、Server、Client、Sample programs、SDK等常用组件大概需要50MB空间
MQ软件的基础软件IBMJava2-SDK-1.4.2-0.0及gsk7bas-7.0-x.x需要91MB的空间
安装SSL支持
需要g++环境
Redhat环境中安装libstdc++5 rpm包即可
需要IBM Global Security Kit v7
该软件包已rpm包提供在MQ安装介质包中
操作系统环境要求
c/c++编译环境
命令行下执行
[mqm@myserver12 bin]$ gcc -v
Reading specs from /usr/lib/gcc/i386-redhat-linux/3.4.3/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-java-awt=gtk --host=i386-redhat-linux
Thread model: posix
gcc version 3.4.3 20041212 (Red Hat 3.4.3-9.EL4)
显示已经安装了gcc 3.4
目前MQ支持gcc/g++ 2.9.5 、3.2、3.3、3.4
WebSphere Server安装设置
创建安装目录
mkdir –p /opt/mqm
mkdir –p /var/mqm/{log,errors}
注意:mqm的安装目录及工作目录必须是以上目录,如果以上目录的空间不够,可以创建一个链接目录,方法如下:
mkdir –p /bigger/mqm
ln –s /bigger/mqm /opt/mqm
创建用户组
groupadd –g 911 mqm
useradd –g 911 –d /var/mqm –u 911 –s /bin/bash mqm
更改目录权限
chown –R mqm:mqm /opt/mqm
chown –R mqm:mqm /var/mqm
注:如果其他用户想有MQ的管理员的权限,比如创建、启动队列管理器,则将其用户名加入到mqm组即可
设置语系环境
$export LANG=zh_CN
注意:上述设置中文,是需要安装mq介质包中相关的语言rpm包
内核参数修改
Websphere MQ 使用System V IPC资源,特别是shared memory和semaphores
需要修改如下资源
/proc/sys/kernel/shmmax-Themaximumsizeofasharedmemorysegment.
/proc/sys/kernel/shmmni-Themaximumnumberofsharedmemorysegments.
/proc/sys/kernel/shmall-Themaximumamountofsharedmemory thatmaybeallocated.
/proc/sys/kernel/sem -Themaximumnumberandsizeofsemaphoresets thatmaybeallocated.
/proc/sys/kernel/msgmnb-Themaximumnumberofbytesonamessagequeue.
修改方法如:
echo 268435456 >/proc/sys/kernel/shmmax
意思是将共享内存段的大小更改为256MB
以下是我机器上的设置:
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.msgmnb=128
kernel.core_uses_pid = 1
kernel.shmmax=524288000
kernel.sem=250 32000 100 128
fs.file-max=65536
kernel.shmmni=4096
net.ipv4.ip_local_port_range=1024 65000
net.core.rmem_default=1048576
net.core.wmem_default=262144
net.core.rmem_max=1048576
net.core.wmem_max=262144
将以上的值直接写入/etc/sysctl.conf 保证系统重启后仍然生效
安装WebSphere MQ 程序
1. root用户登陆
上传WMQv6023Trial-x86_linux.tar.gz介质包到/tmp
$cd /tmp
$tar –xzvf WMQv6023Trial-x86_linux.tar.gz
2. 执行mqlicense.sh接受产品许可协议
$./mqlicense.sh –accept
3. 安装rpm包:
$rpm –ivh MQSeriesRuntime-6.0.2-3.i386.rpm
$rpm –ivh MQSeriesServer-6.0.2-3.i386.rpm
$rpm –ivh MQSeriesClient-6.0.2-3.i386.rpm
$rpm –ivh MQSeriesSamples-6.0.2-3.i386.rpm
$rpm –ivh MQSeriesMsg_Zh_CN-6.0.2-3.i386.rpm
验证测试MQServer
mqm用户登陆设置
测试环境设置
创建一个队列管理
$crtmqm –q yql.queue.manager
you will see messages telling you that the queue manager has been created,and that the default WebSphere MQ objects have been created
启动队列管理
$strmqm
a message tells you when the queue manager has started
开启MQSC
$runmqsc
将会显示启动了一个MQSC,接下来输入一些语句来定义一个名叫ORANAGER.QUEUE队列
DEFINE QLOCAL(ORANGE.QUEUE)
接着会显示队列创建成功
停止MQSC
end
上述一系列命令指创建了一个名为yql.queue.manager的队列管理器,并创建了一个名为ORANGE.QUEUE的队列
测试
$cd /opt/mqm/samp/bin
向队列管理器yql.queue.manager中的队列ORANGE.QUEUE上传信息
$./amqsput ORANGE.QUEUE yql.queue.manager
然后会显示如下信息:
Sample AMQSPUT0 start
target queue is ORANGE.QUEUE
输入一些文本,然后敲两下回车
如:jus one test
从队列管理器yql.queue.manager中的队列ORANGE.QUEUE获取信息
$./amqsget ORANGE.QUEUE yql.queue.manager
如果能返回一下信息则成功
Sample AMQSGET0 start
message < jus one test >
WebSphere MQ Client设置
环境设置
创建一个队列管理器
[mqm@myserver12 bin]$ crtmqm -q lyx.queue.manager
There are 90 days left in the trial period for this copy of WebSphere MQ.
WebSphere MQ queue manager created.
Creating or replacing default objects for lyx.queue.manager.
Default objects statistics : 40 created. 0 replaced. 0 failed.
Completing setup.
Setup completed
启动队列管理器
[mqm@myserver12 bin]$ strmqm lyx.queue.manager
There are 90 days left in the trial period for this copy of WebSphere MQ.
WebSphere MQ queue manager 'lyx.queue.manager' starting.
5 log records accessed on queue manager 'lyx.queue.manager' during the log replay phase.
Log replay for queue manager 'lyx.queue.manager' complete.
Transaction manager state recovered for queue manager 'lyx.queue.manager'.
WebSphere MQ queue manager 'lyx.queue.manager' started.
设置队列及连接通道、监听
[mqm@myserver12 bin]$ runmqsc
5724-H72 (C) Copyright IBM Corp. 1994, 2005.ALL RIGHTS RESERVED.
Starting MQSC for queue manager lyx.queue.manager.
定义一个名为REMOTE_QUEUE队列
DEFINE QLOCAL(REMOTE_QUEUE)
1 : DEFINE QLOCAL(REMOTE_QUEUE)
AMQ8006: WebSphere MQ queue created.
定义一个远程连接CHANNEL2
DEFINE CHANNEL(CHANNEL2) CHLTYPE (SVRCONN) TRPTYPE (TCP) MCAUSER ('MQM')
2 : DEFINE CHANNEL(CHANNEL2) CHLTYPE (SVRCONN) TRPTYPE (TCP) MCAUSER ('MQM')
AMQ8014: WebSphere MQ channel created.
定义一个监听LISTENER2并监听8899端口,不指定端口则用默认的1414
DEFINE LISTENER(LISTENER2) TRPTYPE (TCP) CONTROL (QMGR) PORT(8899)
3 : DEFINE LISTENER(LISTENER2) TRPTYPE (TCP) CONTROL (QMGR) PORT(8899)
AMQ8626: WebSphere MQ listener created.
启动监听LISTENER2
START LISTENER(LISTENER2)
4 : START LISTENER(LISTENER2)
AMQ8021: Request to start WebSphere MQ Listener accepted.
结束
END
5 : END
4 MQSC commands read.
No commands have a syntax error.
All valid MQSC commands were processed.
设置环境变量
[mqm@myserver12 bin]$ export MQSERVER='CHANNEL2/TCP/myserver12(8899)'
测试验证
[mqm@myserver12 bin]$ ./amqsput REMOTE_QUEUE lyx.queue.manager
Sample AMQSPUT0 start
target queue is REMOTE_QUEUE
I LOVE you!!!
Sample AMQSPUT0 end
[mqm@myserver12 bin]$ ./amqsget REMOTE_QUEUE lyx.queue.manager
Sample AMQSGET0 start
message <I LOVE you!!!>
no more messages
Sample AMQSGET0 end
MQ队列管理操作
1. 创建
$crtmqm -q lyx_queue_manager
2. 启动
$strmq lyx_queue_manager
3. 停止
$endmqm lyx_queue_manager
4. 删除
$dltmqm lyx_queue_manager
5. 查看
[mqm@myserver12 bin]$ dspmq
QMNAME(venus.queue.manager) STATUS(Running)
QMNAME(saturn.queue.manager) STATUS(Running)
QMNAME(yql.queue.manager) STATUS(Running)
QMNAME(wwf.queue.manager) STATUS(Running)
QMNAME(lyx.queue.manager) STATUS(Running)
小结:在定义队列名称尽量用大写,否则用小写时amqsput/amqsget读不到队列名称