Sun Java System Message Queue 3.5 SP1 管理指南 |
第 7 章
管理受管理对象使用受管理对象可以开发供其他 JMS 提供者使用的客户机应用程序。受管理对象是指包含提供者特定的配置信息和命名信息的对象。这些对象通常由 Message Queue 管理员创建,由客户机应用程序用来与代理建立连接,然后用于向物理目标发送消息并从物理目标接收消息。
有关受管理对象的概述信息,请参见“Message Queue 受管理对象”。
Message Queue 为创建和管理受管理对象提供了两个管理工具:命令行对象管理器实用程序 (imqobjmgr) 和 GUI 管理控制台。您可以使用这两个工具执行以下操作:
本章说明如何使用对象管理器实用程序 (imqobjmgr) 执行上述任务。由于这些任务涉及到了解您正在使用的对象存储库以及您正在创建的受管理对象的属性,本章在说明如何使用 imqobjmgr 管理受管理对象之前介绍了这两个主题的背景。
有关使用管理控制台的信息,请参见第 4 章“管理控制台教程”。
关于对象存储库受管理对象放置在便于访问的对象存储库中,客户机应用程序可以通过 JNDI 查找访问这些对象。可以使用两种类型的对象存储库:标准 LDAP 目录服务器和文件系统对象存储库。
LDAP 服务器对象存储库
对于生产型消息传送系统,建议使用 LDAP 服务器对象存储库。很多供应商都提供 LDAP 实现,而且 LDAP 实现可以在分布式系统中使用。LDAP 服务器还提供对生产环境特别有用的安全功能。
Message Queue 管理工具可以管理 LDAP 服务器上的对象存储库。不过,您可能需要按照 LDAP 服务器文档中的规定先配置 LDAP 服务器以存储 Java 对象并执行 JNDI 查找。
将 LDAP 服务器用作对象存储库时,需要指定表 7-1 中显示的属性。这些属性分为以下几类:
- 初始上下文:对于 LDAP 服务器对象存储库,该属性是固定的。
- 位置:按照 LDAP 服务器中的设置指定用于存储受管理对象的 URL 和目录路径。特别是,必须检查指定的路径是否存在。
- 安全信息:取决于 LDAP 提供者。应参阅 LDAP 实现附带的文档,以决定是所有的操作都需要安全信息,还是只有更改存储数据的操作需要安全信息。
文件系统对象存储库
Message Queue 还支持文件系统对象存储库实现。文件系统对象存储库尚未进行完整测试,因此不建议用于生产系统。它的优势就是在开发环境中非常易于使用。与其设置一台 LDAP 服务器,还不如在本地文件系统中创建一个目录。
不过,文件系统存储不能用作在多个计算机节点上配置的客户机的集中式对象存储库,除非这些客户机可以访问该对象存储库所在的目录。此外,任何可以访问这个目录的用户都可以使用 Message Queue 管理工具创建和管理受管理对象。
使用文件系统对象存储库时,需要指定表 7-2 中显示的属性。这些属性分为以下几类:
受管理对象有关受管理对象的概述信息,请参见“Message Queue 受管理对象”。
Message Queue 受管理对象有两种基本类型:连接工厂和目标。连接工厂受管理对象由客户机应用程序用来建立与代理之间的连接。目标受管理对象由客户机应用程序用来标识生成方向其发送消息或使用方从其检索消息的目标。(SOAP 消息传送使用特殊的 SOAP 端点受管理对象,有关详细信息,请参阅《Message Queue Java Client Developer's Guide》。)
可以根据消息传送模型(点对点或者发布/订阅)使用特定类型的连接工厂和目标。例如,在点对点编程中,可以使用队列连接工厂和队列目标。同样,在发布和订阅编程中,可以使用主题连接工厂和主题目标。也可以使用非特定的连接工厂和目标受管理对象类型,只要它们属于支持分布式事务的连接工厂类型(要查看所有支持的类型,请参见表 1-1)。
受管理对象的属性是使用属性-值对指定的。下面将介绍这些属性。
连接工厂受管理对象属性
表 7-3 列出了连接工厂(和 XA 连接工厂)受管理对象的属性。最重要的属性是 imqAddressList,它用于指定客户机将与之建立连接的代理。“添加连接工厂”一节说明了如何在向对象存储库中添加连接工厂受管理对象时指定属性。
有关连接工厂属性的说明以及有关如何使用它们的信息,请参见《Message Queue Java Client Developer's Guide》和适用于下列 Message Queue 类的 JavaDoc API 文档:com.sun.messaging.ConnectionConfiguration。
目标受管理对象的属性
表 7-4 列出了标识物理主题或队列目标的目标受管理对象的属性。“添加主题或队列”一节说明了如何在向对象存储库中添加目标受管理对象时指定这些属性。
最重要的属性是 imqDestinationName。这是您为与主题或队列受管理对象相对应的物理目标指定的名称。您也可以为目标提供说明,帮助您将它与您创建以支持更多应用程序的其他目标区分开。
有关详细信息,请参见适用于 Message Queue 类 com.sun.messaging.DestinationConfiguration 的 JavaDoc API 文档。
表 7-4 目标受管理对象的属性
属性/属性名
类型
默认值
imqDestinationDescription
字符串
目标对象的说明
imqDestinationName
字符串1
Untitled_Destination_Object
1目标名称只能包含字母数字字符(不能包含空格),且必须以字母字符或者字符 _ 和/或 $ 开头。
对象管理器实用程序 (imqobjmgr)对象管理器实用程序允许您创建和管理 Message Queue 受管理对象。本节介绍了基本的 imqobjmgr 命令语法,提供了一个子命令列表,并概述了 imqobjmgr 命令选项。下文说明如何使用 imqobjmgr 子命令完成特定任务。
imqobjmgr 命令的语法
imqobjmgr 命令的一般语法如下:
imqobjmgr subcommand [options]imqobjmgr -h|Himqobjmgr -v
请注意,如果指定 -v、-h 或 -H 选项,将不会执行命令行中指定的子命令。例如,输入以下命令将显示版本信息,而不执行 list 子命令。
imqobjmgr list -v
imqobjmgr 子命令
表 7-5 列出了对象管理器实用程序 (imqobjmgr) 包含的子命令:
表 7-5 imqobjmgr 子命令
子命令
说明
add
在对象存储库中添加受管理对象。
delete
从对象存储库中删除受管理对象。
list
列出对象存储库中的受管理对象。
query
显示指定的受管理对象的相关信息。
update
修改对象存储库中的现有受管理对象。
imqobjmgr 命令选项概述
表 7-6 列出了 imqobjmgr 命令的选项。有关如何使用这些选项的论述,请参见基于任务的后续各节。
表 7-6 imqobjmgr 选项
选项
说明
-f
执行操作,而无需用户确认。
-h
显示使用帮助。不在命令行上执行其他命令。
-H
显示使用帮助、属性列表和示例。不在命令行上执行其他命令。
-i fileName
指定命令文件的名称,该文件包含所有或部分子命令子句,指定了对象类型、查找名称、对象属性、对象存储库属性或其他选项。通常用于重复性信息,例如对象存储库属性。
-j attribute=value
指定标识和访问 JNDI 对象存储库所需的属性。请参见“LDAP 服务器对象存储库”和“文件系统对象存储库”。
-javahome path
指定要使用的替代 Java 2 兼容运行时(默认使用系统上的运行时或 Message Queue 附带的运行时)。
-l lookupName
指定受管理对象的 JNDI 查找名称。此名称在对象存储库的上下文中必须唯一。
-o attribute=value
指定受管理对象的属性。请参见“连接工厂受管理对象属性”和“目标受管理对象的属性”。
-pre
预览模式。指出在不执行命令的情况下将执行的操作。
-r read-only_state
指定某个受管理对象是否为只读对象。true 值表示受管理对象为只读对象。客户不能修改只读受管理对象的属性。默认情况下,read-only state 设置为 false。
-s
无提示模式。不显示任何输出。
-t objectType
指定 Message Queue 受管理对象的类型:
q = 队列
t = 主题
cf = 连接工厂
qf = 队列连接工厂
tf = 主题连接工厂
xcf = XA 连接工厂(分布式事务)
xqf = XA 队列连接工厂(分布式事务)
xtf = XA 主题连接工厂(分布式事务)
e = SOAP 端点1
-v
显示版本信息。不在命令行上执行其他命令。
1此受管理对象类型用于支持 SOAP 消息(请参见《Message Queue Java Client Developer's Guide》)。
下一节说明使用 imqobjmgr 子命令时需要提供的信息。
所需的信息
执行大多数与受管理对象相关的任务时,必须指定以下信息作为 imqobjmgr 子命令的选项:
表 7-6 显示了允许的类型。
- 受管理对象的属性(add 和 update 子命令特别需要):
- 对于目标:代理上的物理目标名称。这是使用 imqcmd create dst 子命令的 -n 选项指定的名称。如果不指定名称,将使用默认名称 Untitled_Destination_Object。
- 对于连接工厂:最常用的属性是地址列表 (imqAddressList),用于指定客户机将试图连接的消息服务器地址(一个或多个)。如果不指定此信息,则使用本地主机和默认端口号 (7676),这意味着客户机将试图与本地主机端口 7676 上的某个代理建立连接。“添加连接工厂”一节说明了如何指定对象属性。
有关其他属性的详细信息,请参见“连接工厂受管理对象属性”。
- 对象存储库属性:
此信息取决于您使用的是文件系统存储还是 LDAP 服务器,但必须包括以下属性:
有关对象存储库属性的详细信息,请参见“LDAP 服务器对象存储库”和“文件系统对象存储库”。
使用命令文件
imqobjmgr 命令允许您指定命令文件的名称,该文件使用 Java 属性文件语法表示全部或部分 imqobjmgr 子命令子句。
在对象管理器实用程序 (imqobjmgr) 中使用命令文件对于指定对象存储库属性特别有用,因为对象存储库属性可能在 imqobjmgr 的多次调用中都相同,并且通常需要多次键入。使用命令文件还可以避免一种情况,即避免超出命令行所允许的最大字符数。
imqobjmgr 命令文件的一般语法如下(版本属性反映命令文件的版本,而非 Message Queue 产品的版本,它不是一个命令行选项,它的值必须设置为 2.0):
作为如何使用命令文件的一个示例,请考虑使用以下 imqobjmgr 命令:
imqobjmgr add
-t qf
-l cn=myQCF
-o imqAddressList=mq://foo:777/jms
-j java.naming.factory.initial=
com.sun.jndi.ldap.LdapCtxFactory
-j java.naming.provider.url=
ldap://mydomain.com:389/o=imq
-j java.naming.security.principal=
uid=fooUser, ou=People, o=imq
-j java.naming.security.credentials=fooPasswd
-j java.naming.security.authentication=simple
此命令可以包含在一个文件中(例如 MyCmdFile 文件),其内容如下:
version=2.0
cmdtype=add
obj.type=qf
obj.lookupName=cn=myQCF
obj.attrs.imqAddressList=mq://foo:777/jms
objstore.attrs.java.naming.factory.initial=\
com.sun.jndi.ldap.LdapCtxFactory
objstore.attrs.java.naming.provider.url=\
ldap://mydomain.com:389/o=imq
objstore.attrs.java.naming.security.principal=\
uid=fooUser, ou=People, o=imq
objstore.attrs.java.naming.security.credentials=fooPasswd
objstore.attrs.java.naming.security.authentication=simple
然后可以使用 -i 选项将该文件传递给对象管理器实用程序 (imqobjmgr):
imqobjmgr -i MyCmdFile
也可以使用命令文件指定一些选项,而使用命令行指定其他选项。这样即可使用命令文件指定在实用程序的多次调用中都相同的那部分子命令子句。例如,以下命令可以指定添加连接工厂受管理对象所需的所有选项,但不包括指定受管理对象存储位置的选项。
在本例中,文件 MyCmdFile 将包含以下定义:
version=2.0
objstore.attrs.java.naming.factory.initial=\
com.sun.jndi.ldap.LdapCtxFactory
objstore.attrs.java.naming.provider.url=\
ldap://mydomain.com:389/o=imq
objstore.attrs.java.naming.security.principal=\
uid=fooUser, ou=People, o=imq
objstore.attrs.java.naming.security.credentials=fooPasswd
objstore.attrs.java.naming.security.authentication=simple
可以从以下位置找到命令文件的其他示例:
IMQ_HOME/demo/imqobjmgr
添加和删除受管理对象本节说明如何在对象存储库中添加连接工厂和主题或队列目标的受管理对象。
注意
对象管理器实用程序 (imqobjmgr) 只列出和显示了 Message Queue 受管理对象。如果对象存储库中包含与希望添加的受管理对象具有相同查找名称的非 Message Queue 对象,则您在尝试执行添加操作时将收到一条错误消息。
添加连接工厂
要使客户机应用程序获得与代理的连接,需要添加一个用来表示客户机应用程序所需连接类型的受管理对象:主题连接工厂或队列连接工厂
要添加队列连接工厂,请使用如下所示的命令:
imqobjmgr add
-t qf
-l cn=myQCF
-o imqAddressList=mq://myHost:7272/jms
-j java.naming.factoryinitial=
com.sun.jndi.ldap.LdapCtxFactory
-j java.naming.provider.url=ldap://mydomain.com:389/o=imq
-j java.naming.security.principal=
uid=fooUser, ou=People, o=imq
-j java.naming.security.credentials=fooPasswd
-j java.naming.security.authentication=simple
上述命令创建一个查找名称为 cn=myQCF 的受管理对象,它连接到 myHost 上运行的代理并在端口 7272 上监听。受管理对象存储在 LDAP 服务器上。通过指定一个命令文件作为 imqobjmgr 命令的参数,也可以实现此目的。有关详细信息,请参见“使用命令文件”。
注意
命名惯例:如果使用 LDAP 服务器存储受管理对象,必须像上例那样指定一个前缀为 cn= 的查找名称 (cn=myQCF)。可以通过 -l 选项指定查找名称。如果正在使用文件系统对象存储库,则不必使用 cn 前缀,不过,请不要使用带有 / 的查找名称。请参见表 7-7。
添加主题或队列
要使客户机应用程序能够访问代理上的物理目标,可以将标识这些目标的受管理对象添加到对象存储库中。
最好先创建物理目标,然后再将对应的受管理对象添加到对象存储库中。使用命令行实用程序 (imqcmd) 在代理上创建物理目标,这些目标由对象存储库中的目标受管理对象标识。有关创建物理目标的信息,请参见“获得连接信息”。
以下命令添加了一个标识主题目标的受管理对象,这个主题目标的查找名称为 myTopic,物理目标名称为 TestTopic。受管理对象存储在 LDAP 服务器上。
imqobjmgr add
-t t
-l cn=myTopic
-o imqDestinationName=TestTopic
-j java.naming.factory.initial=
com.sun.jndi.ldap.LdapCtxFactory
-j java.naming.provider.url=
ldap://mydomain.com:389/o=imq
-j java.naming.security.principal=
uid=fooUser, ou=People, o=imq
-j java.naming.security.credentials=fooPasswd
-j java.naming.security.authentication=simple
这是同一个命令,只不过受管理对象存储在 Solaris 文件系统中:
imqobjmgr add
-t t
-l cn=myTopic
-o imqDestinationName=TestTopic
-j java.naming.factory.initial=
com.sun.jndi.fscontext.RefFSContextFactory
-j java.naming.provider.url=
file:///home/foo/imq_admin_objects
以 LDAP 服务器为例,可以使用命令文件 MyCmdFile 指定子命令子句。该文件将包含以下内容:
version=2.0
cmdtype=add
obj.type=t
obj.lookupName=cn=myTopic
obj.attrs.imqDestinationName=TestTopic
objstore.attrs.java.naming.factory.initial=
com.sun.jndi.fscontext.RefFSContextFactory
objstore.attrs.java.naming.provider.url=
file:///home/foo/imq_admin_objects
objstore.attrs.java.naming.security.principal=
uid=fooUser, ou=People, o=imq
objstore.attrs.java.naming.security.credentials=fooPasswd
objstore.attrs.java.naming.security.authentication=simple
使用 -i 选项将该文件传递给 imqobjmgr 命令:
imqobjmgr -i MyCmdFile
添加队列对象与此基本相同,不同之处在于要为 -t 选项指定 q。
删除受管理对象
可以使用 delete 子命令删除受管理对象。必须指定对象的查找名称、类型和地址。
以下命令删除了查找名称为 cn=myTopic 且存储在 LDAP 服务器上的主题的受管理对象。
imqobjmgr delete
-t t
-l cn=myTopic
-j java.naming.factory.initial=
com.sun.jndi.ldap.LdapCtxFactory
-j java.naming.provider.url=
ldap://mydomain.com:389/o=imq
-j java.naming.security.principal=
uid=fooUser, ou=People, o=imq
-j java.naming.security.credentials=fooPasswd
-j java.naming.security.authentication=simple
获得信息可以使用 list 和 query 子命令列出对象存储库中的受管理对象,显示单个对象的相关信息。
受管理对象列表
使用 list 子命令可以获得所有受管理对象的列表,或者某个特定类型的所有受管理对象的列表。以下样例代码假定受管理对象存储在 LDAP 服务器上。
以下命令将列出所有对象。
imqobjmgr list
-j java.naming.factory.initial=
com.sun.jndi.ldap.LdapCtxFactory
-j java.naming.provider.url=
ldap://mydomain.com:389/o=imq
-j java.naming.security.principal=
uid=fooUser, ou=People, o=imq
-j java.naming.security.credentials=fooPasswd
-j java.naming.security.authentication=simple
以下命令将列出类型为 queue 的所有对象。
imqobjmgr list
-t q
-j java.naming.factory.initial=
com.sun.jndi.ldap.LdapCtxFactory
-j java.naming.provider.url=
ldap://mydomain.com:389/o=imq
-j java.naming.security.principal=
uid=fooUser, ou=People, o=imq
-j java.naming.security.credentials=fooPasswd
-j java.naming.security.authentication=simple
单个对象的相关信息
使用 query 子命令可以获得单个受管理对象的相关信息。必须指定对象的查找名称,以及包含受管理对象的对象存储库的属性(如初始上下文和地址)。
在以下示例中,使用 query 子命令显示查找名称为 cn=myTopic 的对象的相关信息。
imqobjmgr query
-l cn=myTopic
-j java.naming.factory.initial=
com.sun.jndi.ldap.LdapCtxFactory
-j java.naming.provider.url=
ldap://mydomain.com:389/o=imq
-j java.naming.security.principal=
uid=fooUser, ou=People, o=imq
-j java.naming.security.credentials=fooPasswd
-j java.naming.security.authentication=simple
更新受管理对象可以使用 update 命令修改受管理对象的属性。必须指定对象的查找名称和地址。可以使用 -o 选项修改属性值。
此命令将改变表示主题连接工厂的受管理对象的属性:
imqobjmgr update
-t tf
-l cn=MyTCF
-o imqReconnectAttempts=3
-j java.naming.factory.initial=
com.sun.jndi.ldap.LdapCtxFactory
-j java.naming.provider.url=
ldap://mydomain.com:389/o=imq
-j java.naming.security.principal=
uid=fooUser, ou=People, o=imq
-j java.naming.security.credentials=fooPasswd
-j java.naming.security.authentication=simple