这是网上的翻译的红皮书,介绍了MQ JMS中基本操作和方法。
使用 MQ JMS 管理工具
管理工具使管理员能定义八种类型的 MQ JMS 对象并把它们存储到 JNDI 名称空间中。然后,JMS 客户机可以通过 JNDI 检索名称空间中的这些受管理对象和使用它们。
可以通过使用本工具来管理的 JMS 对象有:
1.MQQueueConnectionFactory
2.MQTopicConnectionFactory
3.MQQueue
4.MQTopic
5.MQXAQueueConnectionFactory
6.MQXATopicConnectionFactory
7.JMSWrapXAQueueConnectionFactory
8.JMSWrapXATopicConnectionFactory
调用管理工具
管理工具具有一个命令行界面。可以交互式地使用它,也可以用它来启动一个批处理。交互方式提供了一个命令提示,可以在提示上输入管理命令。在批处理方式中,启动工具的命令中包括了含有管理命令脚本的文件名称。
要以交互方式启动工具,请输入命令:
JMSAdmin [-t] [-v] [-cfg config_filename]
其中:
-t
启用跟踪(缺省是跟踪关闭)
-v
产生详细输出(缺省是 terse 输出)
-cfg config_filename
替代配置文件的名称
显示命令提示后,表明此工具可以开始接受管理命令了。此提示最初如以下形式出现:
InitCtx>
表明当前的上下文(也就是所有命名与目录指向的 JNDI 上下文)是在 PROVIDER_URL 配置参数中定义的初始上下文
当遍历目录名称空间时,提示将更改以反映这个移动,从而使提示总是显示当前的上下文。
要以批处理方式启动工具,请输入命令:
JMSAdmin 其中 test.scp 是包含管理命令的脚本文件。文件中的最后一个命令必须是 END 命令。
管理命令
当显示命令提示时,表明此工具可以开始接受命令了。管理命令的格式通常是:
verb [param]*
所有有效命令都至少包含一个(并且只有一个)动词,它以标准或简短形式出现在命令的开头。
动词可使用的参数取决于该动词。例如,动词 END 不能使用任何参数,但是动词 DEFINE 则可以使用任何在 1 和 20 之间的参数。本章以后的部分中将详细讨论至少使用了一个参数的动词。
动词 | 描述 | |
标准 | 简短形式 | |
ALTER | ALT | 更改给定管理对象中的至少一个特性 |
DEFINE | DEF | 创建并存储管理对象,或创建一个新的子上下文。 |
DISPLAY | DIS | 显示存储的一个或多个管理对象的特性或当前上下文的内容 |
DELETE | DEL | 从名称空间中删除一个或多个管理对象或删除一个空的子上下文 |
CHANGE | CHG | 改变当前上下文,允许用户转换初始上下文下任何地方的目录名称空间(暂挂安全性确认) |
COPY | CP | 复制存储的受管理对象,并用另一个名称存储它 |
MOVE | MV | 改变存储的受管理对象的名称 |
END | | 关闭管理工具 |
动词名不区分大小写。
通常,要终止命令时请按下回车键。但是,也可以在回车之前通过直接输入 '+' 号来覆盖它。这将使您能输入多行的命令,如以下示例所示:
DEFINE Q(BookingsInputQueue) +
QMGR(QM.POLARIS.TEST) +
QUEUE(BOOKINGS.INPUT.QUEUE) +
PORT(1415) +
CCSID(437)
以字符 *、# 或 / 开始的行表示一个注解或忽略的行。
操纵子上下文
可以使用动词 CHANGE、DEFINE、DISPLAY 和 DELETE 来操纵目录名称空间子上下文。
语法 | 描述 |
DEFINE CTX(ctxName) | 尝试创建当前上下文的新子女子上下文,使用名称 ctxName。如果安全性违例,或是子上下文已经存在,又或者提供的名称无效则失败。 |
DISPLAY CTX | 显示当前上下文的内容。管理对象用 'a' 注释,子上下文用 '[D]' 注释。此外,还显示每个对象的 Java 类型。 |
DELETE CTX(ctxName) | 尝试删除当前上下文的名为 ctxName 的子上下文。如果没有找到上下文,或上下文是非空的,或如果有安全性违例,则失败。 |
CHANGE CTX(ctxName) | 改变当前上下文,以便它现在可以引用名为 ctxName 的子上下文。将提供 ctxName 的两个特殊值中的一个: =UP 移动到当前上下文的父代 =INIT 直接移动到初始上下文 如果不存在指定的上下文,或是有安全性违例,则失败。 |
管理 JMS 对象
这一部分描述管理工具可以处理的八种对象类型。详细描述它们的每个配置特性以及可操纵它们的每个动词。
对象类型
由管理工具处理的 JMS 对象类型
对象类型 | 描述 | |
Java | 关键字 | |
MQQueueConnectionFactory | QCF | JMS QueueConnectionFactory 接口的 MQSeries 实现。它表示了用于在 JMS 的点到点域中创建连接的工厂对象。 |
MQTopicConnectionFactory | TCF | JMS TopicConnectionFactory 接口的 MQSeries 实现。它表示了用于在 JMS 的发布/订阅域中创建连接的工厂对象。 |
MQQueue | Q | JMS Queue 接口的 MQSeries 实现。它表示了在 JMS 的点到点域中的消息目的地。 |
MQTopic | T | JMS Topic 接口的 MQSeries 实现。它表示了 JMS 的发布/订阅域中的消息目的地。 |
MQXAQueueConnectionFactory1 | XAQCF | JMS XAQueueConnectionFactory 接口的 MQSeries 实现。它表示了用于在使用 XA 版本的 JMS 类的 JMS 的点到点域中创建连接的工厂对象。 |
MQXATopicConnectionFactory1 | XATCF | JMS XATopicConnectionFactory 接口的 MQSeries 实现。它表示了用于在使用 XA 版本的 JMS 发布/订阅域中创建连接的工厂对象。 |
JMSWrapXAQueueConnectionFactory2 | WSQCF | JMS QueueConnectionFactory 接口的 MQSeries 实现。它表示了用于在使用 XA 版本的 JMS 类的 JMS 域的点到点域中创建与 WebSphere 连接的工厂对象。 |
JMSWrapXATopicConnectionFactory2 | WSTCF | JMS TopicConnectionFactory 接口的 MQSeries 实现。它表示了用于在使用 XA 版本的 JMS 类的 JMS 发布/订阅域中创建与 WebSphere 连接的工厂对象。 |
|
与 JMS 对象一起使用的动词
可以使用动词 ALTER、DEFINE、DISPLAY、DELETE、COPY 和 MOVE 来操纵目录名称空间中的受管理对象。 下表概述了它们的用法。
操纵管理对象的命令语法与说明
命令语法 | 描述 |
ALTER TYPE(name) [property]* | 试图更新给定受管理对象提供的特性。如果有安全性,或是没有找到指定的对象,或是提供的新特性无效,则失败。 |
DEFINE TYPE(name) [property]* | 尝试创建类型为 TYPE 并带有所提供特性的管理对象,并尝试把它存储到当前上下文中名称 name 下。 如果安全性违例,或是提供的名称无效或已经存在,又或是提供的新特性无效,则失败。 |
DISPLAY TYPE(name) | 显示类型为 TYPE 的管理对象的特性,它绑定在当前上下文中的名称 name 下。 如果对象不存在,或安全性违例,则失败。 |
DELETE TYPE(name) | 尝试除去类型为 TYPE 的受管理对象的特性,它在当前上下文中,名为 name。 如果对象不存在,或有安全性违例,则失败。 |
COPY TYPE(nameA) TYPE(nameB) | 复制类型为 TYPE 的受管理对象 nameA,并把副本命名为 nameB。所有这些都发生在当前上下文的作用域中。 如果要复制的对象不存在,或对象名 nameB 已经存在,或者有安全性违例,则失败。 |
MOVE TYPE(nameA) TYPE(nameB) | 将类型为 TYPE 的受管理对象 nameA 移动(重命名)到 nameB。所有这些都发生在当前上下文的作用域中。 如果要移动的对象不存在,或对象名 nameB 已经存在,或者有安全性违例,则失败。 |
创建对象
使用以下命令语法创建对象并存储到 JNDI 名称空间中:
DEFINE TYPE(name) [property]*
即,动词 DEFINE,后跟 TYPE(name) 引用的管理对象,最后是零个或多个特性
LDAP 命名考虑事项
要在 LDAP 环境下存储对象,对象名必须遵循一定的约定。其中之一就是对象及子上下文的名称必须包含一个前缀,例如 cn=(公共名称)或 ou=(组织单位)。
管理工具通过允许您引用不带前缀的对象和上下文名称来简化 LDAP 服务供应商的使用。如果不提供前缀,则工具将把缺省前缀(当前是 cn=)自动添加到您提供的名称。
以下示例显示了上述情况。
InitCtx> DEFINE Q(testQueue)
InitCtx> DISPLAY CTX
Contents of InitCtx
a cn=testQueue com.ibm.mq.jms.MQQueue
1 Object(s)
0 Context(s)
1 Binding(s), 1 Administered
注意,即使提供的对象名 (testQueue) 没有前缀,工具会自动添加一个以确保符合 LDAP 的命名约定。同样,提交 DISPLAY Q(testQueue) 时也会添加该前缀。
可能需要配置 LDAP 服务器以存储 Java 对象。中提供了有关此配置的帮助信息。
特性
特性由以下格式的名称-值对组成:
PROPERTY_NAME(property_value)
特性名不区分大小写,并受限于下表中显示的可识别名称集。该表还显示了每一特性的有效特性值。
表 10. 特性名与有效值
特性 | 有效值(缺省值用黑体表示) | |
标准 | 缩写形式 | |
DESCRIPTION | DESC | 任何字符串 |
TRANSPORT | TRAN |
|
CLIENTID | CID | 任何字符串 |
QMANAGER | QMGR | 任何字符串 |
HOSTNAME | HOST | 任何字符串 |
PORT | | 任何正整数 |
CHANNEL | CHAN | 任何字符串 |
CCSID | CCS | 任何正整数 |
RECEXIT | RCX | 任何字符串 |
RECEXITINIT | RCXI | 任何字符串 |
SECEXIT | SCX | 任何字符串 |
SECEXITINIT | SCXI | 任何字符串 |
SENDEXIT | SDX | 任何字符串 |
SENDXITINIT | SDXI | 任何字符串 |
TEMPMODEL | TM | 任何字符串 |
MSGRETENTION | MRET |
|
BROKERVER | BVER | V1 - 当前只允许这个值。 |
BROKERPUBQ | BPUB | 任何字符串(缺省值是 SYSTEM.BROKER.DEFAULT.STREAM) |
BROKERSUBQ | BSUB | 任何字符串(缺省值是 SYSTEM.JMS.ND.SUBSCRIPTION.QUEUE) |
BROKERDURSUBQ | BDSUB | 任何字符串(缺省值是 SYSTEM.JMS.D.SUBSCRIPTION.QUEUE) |
BROKERCCSUBQ | CCSUB | 任何字符串(缺省值是 SYSTEM.JMS.ND.CC.SUBSCRIPTION.QUEUE) |
BROKERCCDSUBQ | CCDSUB | 任何字符串(缺省值是 SYSTEM.JMS.D.CC.SUBSCRIPTION.QUEUE) |
BROKERQMGR | BQM | 任何字符串 |
BROKERCONQ | BCON | 任何字符串 |
EXPIRY | EXP |
|
PRIORITY | PRI |
|
PERSISTENCE | PER |
|
TARGCLIENT | TC |
|
ENCODING | ENC | 参阅ENCODING 特性 |
QUEUE | QU | 任何字符串 |
TOPIC | TOP | 任何字符串 |
特性与对象类型的有效组合
特性 | 有效对象类型 | 描述 | |||||
QCF | TCF | Q | T | WSQCF XAQCF | WSTCF XATCF | ||
DESCRIPTION | Y | Y | Y | Y | Y | Y | 对存储对象的描述。 |
TRANSPORT | Y | Y | | | Y1 | Y1 | 连接是否使用 MQ Bingdings 或客户机连接 |
CLIENTID | Y | Y | | | Y | Y | 客户机的字符串标识 |
QMANAGER | Y | Y | Y | | Y | Y | 要连接到的队列管理器的名称 |
PORT | Y | Y | | | | | 队列管理器正在侦听的端口 |
HOSTNAME | Y | Y | | | | | 队列管理器所在的主机名称 |
CHANNEL | Y | Y | | | | | 要使用的客户机连接通道 |
CCSID | Y | Y | Y | Y | | | 连接中要使用的 coded-character-set-ID |
RECEXIT | Y | Y | | | | | 使用的接收出口的全限定类名 |
RECEXITINIT | Y | Y | | | | | 接收出口初始化字符串 |
SECEXIT | Y | Y | | | | | 要使用的安全性出口的全限定类名 |
SECEXITINIT | Y | Y | | | | | 安全性出口的初始化字符串 |
SENDEXIT | Y | Y | | | | | 要使用的发送出口的全限定类名 |
SENDEXITINIT | Y | Y | | | | | 发送出口的初始字符串 |
TEMPMODEL | Y | | | | Y | | 从中创建临时队列的模型队列名称 |
MSGRETENTION | Y | | | | Y | | 连接使用者是否在输入队列中保留了不需要的消息 |
BROKERVER | | Y | | | | Y | 要使用的代理的版本 |
BROKERPUBQ | | Y | | | | Y | 代理输入队列(流队列)的名称 |
BROKERSUBQ | | Y | | | | Y | 检索非长期订阅消息的队列名称 |
BROKERDURSUBQ | | | | Y | | | 检索长期订阅消息的队列名称 |
BROKERCCSUBQ | | Y | | | | Y | 为 ConnectionConsumer 检索非长期订阅消息的队列名称 |
BROKERCCDSUBQ | | | | Y | | | 为 ConnectionConsumer 检索长期订阅消息的队列名称 |
BROKERQMGR | | Y | | | | Y | 运行着代理的队列管理器 |
BROKERCONQ | | Y | | | | Y | 代理的控制队列名称 |
EXPIRY | | | Y | Y | | | 一个时间段,在该时间段后目的地上的消息将失效 |
PRIORITY | | | Y | Y | | | 发送到目的地的消息的优先级 |
PERSISTENCE | | | Y | Y | | | 发送到目的地的消息的持续性 |
TARGCLIENT | | | Y | Y | | | 字段表明是否使用 MQSeries RFH2 格式与目标应用程序交换信息 |
ENCODING | | | Y | Y | | | 该目的地使用的编码方案 |
QUEUE | | | Y | | | | 表示目的地的队列的基本名称 |
TOPIC | | | | Y | | | 表示目的地的主题的基本名称 |
记录:
1. 对于 WSTCF、WSQCF、XATCF 和 XAQCF 对象,只能使用 BIND 传送类型。
- 管理工具特性与可编程特性之间的映射显示了工具设置的特性和可编程特性之间的关系。
- TARGCLIENT 特性表明了是否使用 MQSeries RFH2 格式与目标应用程序交换信息。
常量 MQJMS_CLIENT_JMS_COMPLIANT 表明将使用 RFH2 格式来发送信息。使用 MQ JMS 的应用程序了解 RFH2 格式。在与目标 MQ JMS 应用程序交换信息时应设置 MQJMS_CLIENT_JMS_COMPLIANT 常量。
常量 MQJMS_CLIENT_NONJMS_MQ 表明将使用 RFH2 格式来发送信息。通常,该值用于现有的 MQSeries 应用程序(即,它不处理 RFH2)。
特性相关性
某些特性在彼此之间有着相关性。这就是说,仅提供一个特性是毫无意义的,只有把另一个特性设置成某个特定的值时才有意义。会发生这种情况的两个特定特性是"客户机特性"和"出口化初始字符串"。
客户机特性
如果 TRANSPORT(CLIENT) 特性没有显式地设置在连接工厂上,则提供连接上使用的传送的工厂是 MQ Bindings。因此,不能在该连接工厂上配置任何客户机特性。这些特性是:
· HOST
· PORT
· CHANNEL
· CCSID
· RECEXIT
· RECEXITINIT
· SECEXIT
· SECEXITINIT
· SENDEXIT
· SENDEXITINIT
如果尝试在没有为 CLIENT 设置 TRANSPORT 特性的情况下设置这些特性中的任何一个,将出错。
出口初始化字符串
除非已提供了相应的出口名,否则设置任何出口初始化字符串都是无效的。出口初始化特性有:
· RECEXITINIT
· SECEXITINIT
· SENDEXITINIT
例如,指定 RECEXITINIT(myString) 时没有指定 RECEXIT(some.exit.classname) 将出错。
ENCODING 特性
ENCODING 可以采用的有效值比其它特性更复杂。编码特性是通过三个子特性来构造的:
整数编码
这是标准编码或反码编码
十进制编码
这是标准编码或反码编码
浮点编码
这是 IEEE 标准编码、IEEE 反码编码或 System/390(R)
ENCODING 由具有下列语法的三个字符组成的字符串来表示:
{N|R}{N|R}{N|R|3}在该字符串中:
- N 表示标准编码
- R 表示反码编码
- 3 表示 System/390
- 第一个字符表示整数编码
- 第二个字符表示十进制编码
- 第三个字符表示浮点编码
它为 ENCODING 特性提供了十二种可能值的集合。
还有一个附加的值,字符串 NATIVE,它用于为 Java 平台设置适当的编码值。
下列示例显示了 ENCODING 的有效组合:
ENCODING(NNR)
ENCODING(NATIVE)
ENCODING(RR3)
样本错误条件
这个部分提供了在创建对象期间可能发生的错误条件。
未知特性
InitCtx/cn=Trash> DEFINE QCF(testQCF) PIZZA(ham and mushroom)
无法创建有效对象,请检查所提供的参数
未知特性:PIZZA
无效的对象特性
InitCtx/cn=Trash> DEFINE QCF(testQCF) PRIORITY(4)
无法创建有效对象,请检查所提供的参数
无效 QCF 特性:PRI
无效的特性值类型
InitCtx/cn=Trash> DEFINE QCF(testQCF) CCSID(english)
无法创建有效对象,请检查所提供的参数
CCS 特性值无效:英语
特性值超出有效范围
InitCtx/cn=Trash> DEFINE Q(testQ) PRIORITY(12)
无法创建有效对象,请检查所提供的参数
无效的 PRI 特性值:12
特性冲突 - 客户机/绑定
InitCtx/cn=Trash> DEFINE QCF(testQCF) HOSTNAME(polaris.hursley.ibm.com)
无法创建有效对象,请检查所提供的参数
上下文中无效特性:客户机-绑定属性冲突
特性冲突 - 出口初始化
InitCtx/cn=Trash> DEFINE QCF(testQCF) SECEXITINIT(initStr)
无法创建有效对象,请检查所提供的参数
上下文中无效特性:提供了 ExitInit 字符串
没有 Exit 字符串
1。能否利用触发器做数据分发?
2。用两个队列管理器做集群,测试一下故障转移?
3。队列如何共享?
4。结合SSL和JMS?
5.触发器和出口之间有何区别?
触发
队列管理器把某些条件定义为触发器事件(trigger event)。如果对于一个队列启用了触发而且发生了触发器事件,那么队列管理器把触发器消息发送到被称为初始队列(initiation queue)的队列。初始队列中触发器消息的存在表明发生了触发器事件。队列管理器生成的触发器消息不是持久的。
处理初始队列的程序被称为触发器监视器应用程序(trigger monitor application),它的功能是读取触发器消息,然后根据触发器消息中的信息执行适当的操作。在通常的情况下,该操作启动一些其他应用程序来处理生成触发器消息的队列。从队列管理器的角度来看,触发器监视器应用程序并没有什么特别的地方 — 它仅仅是另一个从队列(初始队列)中读取消息的应用程序。
如果对于一个队列启用了触发,那么您可以创建与它关联的过程定义对象(process-definition object)。该对象包含了处理引起触发器事件的消息的应用程序的有关信息。如果过程定义对象被创建,那么队列管理器抽取这些信息并把它们放置在触发器消息中以使触发器监视器应用程序可以使用这些信息。ProcessName 本地队列属性给出了与队列关联的过程定义的名称。每个队列可以指定不同的过程定义,或者,几个队列可以共享相同的过程定义。
对于队列管理器来说,触发器监视器类似于任何其他为队列服务的应用程序,唯一的差别是它仅为初始队列提供服务。触发器监视器通常是不停地运行的应用程序。当触发器消息到达初始队列时,触发器监视器检索该消息。它使用消息中的信息来发布命令,该命令将启动处理应用程序队列中的消息的应用程序。