Duangw

MQSeries管理

索引:

  1. 队列管理器配置文件
  2. 控制命令(Control Commands)
  3. 使用MQSC管理本地对象(local MQSeries objects)
  4. 使用MQSC管理远程对象
  5. 保护MQ对象
  6. 配置文件

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).建立队列管理器

注意事项:

配置文件:

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

两种方法:

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 (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).准备队列管理器

在两个系统上都要做的工作:

在目标队列管理器上:

(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