MQSeries管理
索引:
1.队列管理器配置文件
UNIX:/var/mqm/qmgrs/queue.manager/qm.ini;
Windows:c:\mqm\qmgrs\queue!manager(队列管理器名为queue.manager)。
2.控制命令(Control Commands)
执行对队列管理器(queue manager)、command servers、channels的操作。有如下命令:
(1).建立队列管理器
注意事项:
- 在网络里队列管理器名称必须唯一;
- 限制队列管理器的数量,因为每个管理器都要消耗资源;
- 定义一个缺省的队列管理器,使用crtmqm的-q选项;
- 定义一个dead-letter queue,使用crtmqm的-u选项;
- 定义一个缺省的transmission queue,使用crtmqm的-d选项;
- 定义日志参数;
配置文件:
MQSeries configuration file(mqs.ini):每个安装拷贝一份;
queue manager configurationfile(qm.ini):每个队列管理器一份。
建立缺省队列管理器:
crtmqm -q -d MY.DEFAULT.XMIT.QUEUE -u \ SYSTEM.DEAD.LETTER.QUEUE saturn.queue.manager
其中:
-q,定义为缺省队列管理器;
-d,指定缺省transmission queue;
-u,指定dead-letter queue;
saturn.queue.manager为队列管理器名称;
(2).启动队列管理器
strmqm saturn.queue.manager
(3).把一个存在的对立管理器设置为缺省队列管理器
手工修改配置文件mqs.ini中的DefaultQueueManager分节。
(4).停止队列管理器
Quiesced shutdown,等待所有的应用连接断开:
endmqm saturn.queue.manager; endmqm -c saturn.queue.manager;提醒应用终止,与上等效。 endmqm -w saturn.queue.manager;等待所有应用程序终止和队列管理器终止。
Immediate shutdown,允许当前MQI CALL完成,不接受新的MQI CALL,不等待应用断开连接:
endmqm -i saturn.queue.manager
Preemptive shutdown,极端做法,立即终止:
endmqm -p saturn.queue.manager
(5).删除队列管理器
dltmqm saturn.queue.manager
3.使用MQSC管理本地对象(local MQSeries objects)
应用程序可以放消息到本地或远程队列(使用MQPUT),但只可以从本地队列直接获得消息(使用MQGET)。
MQSC命令和属性不区分大小写,但对象本身是区分大小写的。
支持输入/输出的重定向(stdin/stdout)。
(1).启动MQSC命令
runmqsc,不输入参数则管理缺省队列管理器,否则要指出队列管理器名。
命令内容以“+”表示续行,没有表示结束,也可用“;”明确表示结束。
(2).结束MQSC命令
END 或输入EOF字符
(3).显示队列管理器属性
DISPLAY QMGR (ALL)
(4).修改队列管理器属性
ALTER QMGR DEADQ (ANOTHERDLQ) INHIBTEV (ENABLED)
在ALTER QMGR后列出要修改的属性和值。
(5).运行文本中的MQSC命令
runmqsc < myprog.in,使用重定向
文件每行不要超过72字符,例子文本:
amqscos0.tst:Definitions of objects used by sample programs;
amqscic0.tst:Definitions of queues for CICS transactions。
所在目录:
mqmtop/samp(UNIX);
mqmtop\tools\mqsc\samples(WIN)。
校验文本:
runmqsc -v < myprog.in > myprog.out
不能校验远程队列管理器。
(6).定义本地队列(loacl queue)
DEFINE QLOCAL (ORANGE.LOCAL.QUEUE) + 名称 DESCR('Queue for messages') + 描述 PUT (DISABLED) + 不允许put GET (ENABLED) + 允许get NOTRIGGER + 不产生trigger MSGDLVSQ (FIFO) + 使用FIFO模式 MAXDEPTH (1000) + 最多1000个消息 MAXMSGL (2000) + 每个消息最大2000字节 USAGE(NORMAL); 普通队列(非transmission queue)
(7).定义a dead-letter queue
两种方法:
- 在crtmqm中指定-u选项;
- 使用ALTER QMGR命令。
Dead-letter队列必须是一个本地队列,而且其MAXMSGL参数必须足够大,能存放当前最大的消息。
一个例子是:SYSTEM.DEAD.LETTER.QUEUE,在建立队列管理器时自动创建。
(8).显示队列的缺省属性
有一个系统队列:SYSTEM.DEFAULT.LOCAL.QUEUE,用户没指定的属性都从它复制过来。所以命令如下:
DISPLAY QUEUE (SYSTEM.DEFAULT.LOCAL.QUEUE)
(9).显示队列的属性
DISPLAY QUEUE (ORANGE.LOCAL.QUEUE) + MAXDEPTH + MAXMSGL + CURDEPTH;
显示队列ORANGE.LOCAL.QUEUE的MAXDEPTH、MAXMSGL和CURDEPTH。其中CURDEPTH队列的当前深度,即当前在队列的消息数量。
不指定具体的属性名称则显示所有属性:
DISPLAY QUEUE (ORANGE.LOCAL.QUEUE)
(10).复制队列的定义
定义队列MAGENTA.QUEUE,其属性与ORANGE.LOCAL.QUEUE相同:
DEFINE QLOCAL (MAGENTA.QUEUE) + LIKE (ORANGE.LOCAL.QUEUE)
在复制的同时也可进行修改:
DEFINE QLOCAL (THIRD.QUEUE) + LIKE (ORANGE.LOCAL.QUEUE) + MAXMSGL(1024);
当定义一个没有使用LIKE的队列时,其实际等于:
DEFINE LIKE(SYSTEM.DEFAULT.LOCAL.QUEUE)
(11).修改本地队列的属性
有两种方法,但效果不同:
- ALTER QLOCAL;
- DEFINE QLOCAL,使用REPLACE。
ALTER QLOCAL (ORANGE.LOCAL.QUEUE) + MAXMSGL(10000);
修改MAXMSGL属性,其他保持不变。
DEFINE QLOCAL (ORANGE.LOCAL.QUEUE) + MAXMSGL(1000) REPLACE;
不仅仅修改了MAXMSGL,其他属性都被缺省值覆盖。
(12).清空本地队列
删除队列中的所有消息:
CLEAR QLOCAL (MAGENTA.QUEUE)
当队列中有未提交的消息,或还有应用程序打开队列时,无法清空。
(13).删除一个本地队列
DELETE QLOCAL (PINK.QUEUE);
不能删除有未提交的消息的队列。
使用PURGE可以删除含有已提交消息的队列:
DELETE QLOCAL (PINK.QUEUE) PURGE
使用UNPURGE不可以删除含有已提交消息的队列。
(14).浏览(browse)队列中的内容
程序和源代码:
UNIX:Source:mqmtop/samp/amqsbcg0.c;
Executable:mqmtop/samp/bin/amqsbcg。
WINDOWS:Source:c:\mqm\tools\c\samples\amqsbcg0.c;
Executable:c:\mqm\tools\c\samples\bin\amqsbcg.exe。
使用时指定两个参数,队列名和队列管理器名:
amqsbcg SYSTEM.ADMIN.QMGREVENT.tpp1 saturn.queue.manager
(15).定义别名(an alias queue)
DEFINE QALIAS (MY.ALIAS.QUEUE) TARGQ + (YELLOW.QUEUE);
定义队列YELLOW.QUEUE的别名MY.ALIAS.QUEUE。
ALTER QALIAS (MY.ALIAS.QUEUE) TARGQ + (MAGENTA.QUEUE);
可以修改别名使其指向别的队列。
定义别名可修改属性,使同一个对列不同的别名有不同的属性:
DEFINE QALIAS (ALPHAS.ALIAS.QUEUE) + TARGQ (YELLOW.QUEUE) + PUT (ENABLED) + GET (DISABLED) DEFINE QALIAS (BETAS.ALIAS.QUEUE) + TARGQ (YELLOW.QUEUE) + PUT (DISABLED) + GET (ENABLED)
也可使用LIKE和REPLACE来定义别名。
(16).使用别名的其他命令
DISPLAY QUEUE (ALPHAS.ALIAS.QUEUE); ALTER QALIAS (ALPHAS.ALIAS.QUEUE) + TARGQ(ORANGE.LOCAL.QUEUE) FORCE DELETE QALIAS (ALPHAS.ALIAS.QUEUE);
(17).定义model队列
model队列提供一个模板,当请求该类队列时,由队列管理器动态产生一个队列。
定义方法同定义本地队列,此外,还可指定动态队列是临时temporary或永久的permanent。
DEFINE QMODEL (GREEN.MODEL.QUEUE) + DESCR('Queue for messages from application X') + PUT (DISABLED) + GET (ENABLED) + NOTRIGGER + MSGDLVSQ (FIFO) + MAXDEPTH (1000) + MAXMSGL (2000) + USAGE (NORMAL) + DEFTYPE (PERMDYN)
其中DEFTYPE指定产生的动态队列是permanent dynamic queues。
缺省属性来源于SYSYTEM.DEFAULT.MODEL.QUEUE。
(18).使用model的其他命令
DISPLAY QUEUE (GREEN.MODEL.QUEUE); ALTER QMODEL (BLUE.MODEL.QUEUE) PUT(ENABLED); DELETE QMODEL (RED.MODEL.QUEUE);
(19).定义应用队列的triggering
DEFINE QLOCAL (MOTOR.INSURANCE.QUEUE) + PROCESS (MOTOR.INSURANCE.QUOTE.PROCESS) + trigger产生时执行的应用 MAXMSGL (2000) + DEFPSIST (YES) + INITQ (MOTOR.INS.INIT.QUEUE) + initiation queue名,放trigger消息 TRIGGER + 使用trigger TRIGTYPE (DEPTH) + 指定trigger发生的事件:超过TRIGDPTH TRIGDPTH (100)+ 产生trigger的消息数量 TRIGMPRI (5); 计算消息的最低优先级
(20).定义initiation queue
当trigger事件发生时,放置trigger消息在initiation queue中。
定义方法同local queue,可类似如下定义:
DEFINE QLOCAL(MOTOR.INS.INIT.QUEUE) + GET (ENABLED) + NOSHARE + NOTRIGGER + MAXMSGL (2000) + MAXDEPTH (1000)
(21).定义process
DEFINE PROCESS (MOTOR.INSURANCE.QUOTE.PROCESS) + DESCR ('Insurance request message processing') + APPLTYPE (UNIX) + 应用类型 APPLICID ('/u/admin/test/IRMP01') + 可执行程序路径 USERDATA ('open, close, 235');用户自定义数据由应用使用
(22).显示process的属性
DISPLAY PROCESS (MOTOR.INSURANCE.QUOTE.PROCESS);
也可使用ALTER PROCESS和DELETE PROCESS来修改/删除process。
4.使用MQSC管理远程对象
(1).启动命令服务器(command server)
命令strmqcsv,后跟队列管理器名:
strmqcsv saturn.queue.manager
(2).显示command server的状态
dspmqcsv saturn.queue.manager;
(3).停止command server
endmqcsv saturn.queue.manager; 与endmqcsv -c saturn.queue.manager等同;
立即停止:
endmqcsv -i saturn.queue.manager;
(4).准备队列管理器
在两个系统上都要做的工作:
- 建立好队列管理器和缺省的对象(crtmqm);
- 启动队列管理器(strmqm)。
在目标队列管理器上:
- 队列SYSTEM.ADMIN.COMMAND.QUEUE必须存在;
- command server必须启动(strmqcsv)。
(5).准备channels和transmission queues
需要两个channels,每个方向一个;他们关联着transmission queue。以TCP为例。
(6).定义channels和transmission queues
在源端队列管理器:
定义Sender channel:
DEFINE CHANNEL ('source.to.target') + CHLTYPE(SDR) + CONNAME (RHX5498) + 机器的网络名称 XMITQ ('target.queue.manager') + transmission queue名 TRPTYPE(TCP)
定义receiver channel:
DEFINE CHANNEL ('target.to.source') + CHLTYPE(RCVR) + TRPTYPE(TCP)
定义transmission queue:
DEFINE QLOCAL ('target.queue.manager') + USAGE (XMITQ)
在目的端队列管理器:
定义sender channel:
DEFINE CHANNEL ('target.to.source') + CHLTYPE(SDR) + CONNAME (RHX7721) + XMITQ ('source.queue.manager') + TRPTYPE(TCP)
定义receiver channel
DEFINE CHANNEL ('source.to.target') + CHLTYPE(RCVR) + TRPTYPE(TCP)
定义transmission queue
DEFINE QLOCAL ('source.queue.manager') + USAGE (XMITQ)
(7).启动channels
UNIX平台:
启动监听器:配置inetd,使其正常运行MQ监听器;
在源端启动channels:
runmqchl -c source.to.target -m source.queue.manager &;
在目的端启动channels:
runmqchl -c target.to.source -m source.queue.manager &;
Windows平台:
启动监听器:
在源端:
START runmqlsr -t TCP -m source.queue.manager;
在目的端:
START runmqlsr -t TCP -m target.queue.manager;
在源端启动channels:
START runmqchl -c source.to.target -m source.queue.manager;
在目的端启动channels:
START runmqchl -c target.to.source -m source.queue.manager;
(8).远程执行MQSC命令
在目的端保证已经启动command server:
strmqcsv target.queue.manager;
在源端:
runmqsc -w 30 target.queue.manager;(超时为30秒)
使用重定向:
runmqsc -w 60 target.queue.manager < mycomds.in > report.out;
(9).建立a local definition of a remote queue
DEFINE QREMOTE (CYAN.REMOTE.QUEUE) + 远程对象的本地名字 DESCR ('Queue for insur req from the branches') + 说明 RNAME (AUTOMOBILE.INSURANCE.QUOTE.QUEUE) + 远程队列管理 器的一个本地队列名 RQMNAME (jupiter.queue.manager) + 远程队列管理器的名字 XMITQ (INQUOTE.XMIT.QUEUE); transmission queue名, 若不指定,则使用一个名字与远程管理器名称相同的队列。
(10).使用local definition的其他命令
DISPLAY QUEUE (CYAN.REMOTE.QUEUE); ALTER QREMOTE (CYAN.REMOTE.QUEUE) PUT(ENABLED); DELETE QREMOTE (CYAN.REMOTE.QUEUE);
不能删除一个远程对象,只是删除了本地引用。
(11).建立a transmission queue
当向远程队列放置消息时,若没有指定transmission queue,则缺省使用名字与远程队列管理器名称相同的transmission queue,若这样的队列不存在,则定义它。
DEFINE QLOCAL ('target.queue.manager') + DESCR ('Default transmission queue for target qm') + USAGE (XMITQ);
5.保护MQ对象
在UNIX下,存取MQ对象的用户ID必须是mqm组的成员。若管理一个远程对象,则该用户ID也必须是远程系统的mqm组成员。
在WINDOWS下,用户ID必须是mqm组或administrators组的成员。若管理一个远程对象,则该用户ID也必须是远程系统的mqm组或administrators组的成员。
缺省OAM(object authority manager)是起作用的,可以禁止它,在队列管理器建立之前设置环境变量:
UNIX:export MQSNOAUT=yes
WNDOWS:SET MQSNOAUT=yes
但这样做之后,没法再起用OAM。
禁用OAM的另一法是在queue manager configuration file(qm.ini)删除uthorization service stanza。
6.配置文件
mqs.ini
qm.ini