受管理对象封装特定于提供者的配置和命名信息,以便开发可以从一个 JMS 提供者移植到另一个 JMS 提供者的客户端应用程序。通常,Message QueueTM 管理员为客户端应用程序创建受管理对象,以便在获取用于发送和接收消息的代理连接时使用。
本章介绍了如何使用对象管理器实用程序 (imqobjmgr) 来创建和管理受管理对象。本章包含以下各节:
受管理对象放在易于使用的对象存储库中,客户端应用程序可以通过 Java 命名和目录接口 (Java Naming and Directory Interface, JNDI) 从该对象存储库中访问这些对象。可以使用两种类型的对象存储库:标准的轻量目录访问协议 (Lightweight Directory Access Protocol, LDAP) 目录服务器或本地文件系统中的目录。
对于生产消息传送系统,建议将 LDAP 服务器用作对象存储库。LDAP 服务器针对分布式系统而设计,它提供了在生产环境中非常有用的安全功能。
许多供应商都提供 LDAP 实现。要使用 Message Queue 管理工具管理 LDAP 服务器上的对象存储库,可能需要先配置服务器,使其可以存储 Java 对象并执行 JNDI 查找;有关详细信息,请参见随 LDAP 实现一起提供的文档。
要将 LDAP 服务器用作对象存储库,必须指定表 8–1 中所示的属性。这些属性分为以下几个类别:
初始上下文。 java.naming.factory.initial 属性指定在服务器上执行 JNDI 查找的初始上下文。此属性值对于给定的 LDAP 对象存储库是固定的。
位置。java.naming.provider.url 属性指定 LDAP 服务器的 URL 和目录路径。必须验证指定的目录路径是否存在。
安全性。java.naming.security.principal、java.naming.security.credentials 和 java.naming.security.authentication 属性管理尝试访问对象存储库的呼叫者的验证。这些属性的准确格式和值因 LDAP 服务提供者而异;请参见随 LDAP 实现一起提供的文档以了解详细信息,并确定是所有操作都需要安全信息,还是只有更改存储数据的操作需要安全信息。
属性 |
描述 |
---|---|
JNDI 查找的初始上下文 示例: com.sun.jndi.ldap.LdapCtxFactory |
|
服务器 URL 和目录路径 示例: ldap://myD.com:389/ou=mq1,o=App 其中受管理对象存储库在目录 /App/mq1 中。 |
|
用于验证呼叫者的主体标识 此属性的格式取决于验证方案:例如, uid=homerSimpson,ou=People,o=mq 如果未指定此属性,行为将由 LDAP 服务提供者决定。 |
|
验证主体的凭证 此属性的值取决于验证方案:例如,它可能是散列密码、明文密码、密钥或证书。 如果未指定此属性,行为将由 LDAP 服务提供者决定。 |
|
验证的安全级别 此属性的值为 none、 simple 或 strong 关键字中的一个。例如,如果指定 simple,则当缺少任何主体或凭证值时,系统都会提示您。 这样您可以使用一种更安全的方法来提供身份信息。 如果未指定此属性,行为将由 LDAP 服务提供者决定。 |
Message Queue 也支持将本地文件系统中的目录用作受管理对象的对象存储库。虽然不建议在生产系统中使用这种方法,但该方法的优点是非常易于在开发环境中使用。但是,请注意,如果要将目录用作部署于多个计算机节点上的客户端的集中式对象存储库,则所有这些客户端都必须能够访问该目录。此外,可以访问该目录的所有用户均可使用 Message Queue 管理工具来创建和管理受管理对象。
要将文件系统目录用作对象存储库,必须指定表 8–2 中所示的属性。这些属性与上述 LDAP 对象存储库属性的一般含义相同;不同的是,java.naming.provider.url 属性指定保存该对象存储库的目录的路径。此目录必须存在,并且 Message Queue 管理工具用户以及将访问该存储库的客户端应用程序用户必须对该目录具有正确的访问权限。
表 8–2 文件系统对象存储库属性
属性 |
描述 |
|
---|---|---|
|
JNDI 查找的初始上下文 示例: com.sun.jndi.fscontext.RefFSContextFactory |
|
|
目录路径 示例: file:///C:/myapp/mqobjs |
Message Queue 受管理对象有两种基本类型:
连接工厂供客户端应用程序在创建代理连接时使用。
目的地表示客户端应用程序可以与之交换(发送和检索)消息的代理中的位置。
特殊的 SOAP 端点受管理对象用于 SOAP 消息传送;有关详细信息,请参见 Message Queue Developer's Guide for Java Clients。
上述每种类型的受管理对象都具有一些特定属性,用于确定对象的属性和行为。本节介绍了如何使用对象管理器命令行实用程序 (imqobjmgr) 来设置这些属性;也可以使用 GUI 管理控制台进行设置,如使用受管理对象中所述。
客户端应用程序使用连接工厂受管理对象来创建与代理交换消息时使用的连接。连接工厂的属性定义了它所创建的所有连接的属性。创建连接后,将无法更改其属性;因此,配置连接属性的唯一方法就是设置用于创建连接的连接工厂的属性。
Message Queue 定义了两类连接工厂对象:
这两类对象共享相同的配置属性,可以通过这些属性来优化资源、性能和消息吞吐量。第 16 章,受管理对象属性参考详细列出并说明了这些属性,以下各节将对这些属性进行讨论:
连接处理属性指定了要连接到的代理地址,以及如何检测连接故障并尝试重新连接(如果要求)。表 16–1 概要介绍了这些属性。
最重要的连接处理属性是 imqAddressList ,该属性指定了要与之建立连接的一个或多个代理。该属性的值是一个字符串,它包含一个代理地址或者以逗号分隔的多个地址(如果是代理群集)。根据要使用的连接服务(请参见连接服务)和建立连接的方法,代理地址可以使用各种寻址方案:
mq,该方案使用代理的端口映射器为 jms 或 ssljms 连接服务动态指定端口。
mqtcp,该方案通过使用 jms 连接服务绕过端口映射器,而直接连接到指定端口。
mqssl,该方案通过使用 ssljms 连接服务与指定端口建立安全套接字层 (Secure Socket Layer, SSL) 连接。
http,该方案通过使用 httpjms 连接服务与指定 URL 处的 Message Queue 隧道 Servlet 建立超文本传输协议 (Hypertext Transport Protocol, HTTP) 连接。
https,该方案通过使用 httpsjms 连接服务与指定 URL 处的 Message Queue 隧道 Servlet 建立安全超文本传输协议 (Secure Hypertext Transport Protocol, HTTPS) 连接。
表 16–2 概述了这些寻址方案。
每个代理地址的通用格式为:
scheme://address
其中 scheme 是上面列出的寻址方案之一,而 address 表示代理地址本身。用于指定地址的准确语法因寻址方案而异,如表 16–2 中的最后一列所示。表 16–3 提供了各种地址格式的示例。
在多代理群集环境中,地址列表可能包含多个代理地址。如果第一次连接尝试失败,Message Queue 客户端运行时环境将尝试连接到列表中的另一个地址,依此类推,直到尝试完列表中的所有地址为止。其他两个连接工厂属性控制上述操作的执行方式:
imqAddressListBehavior 指定了尝试连接指定地址的顺序。如果将此属性设置为字符串 PRIORITY,将按地址在地址列表中的显示顺序尝试连接。如果属性值为 RANDOM,将按随机顺序尝试连接地址;这种方式非常有用,例如,当许多 Message Queue 客户端共享同一个连接工厂对象时,这种方式有助于防止所有客户端尝试连接到同一个代理地址。
imqAddressListIterations 指定了循环访问列表的次数,超过该次数后,将放弃尝试并报告故障。值为 -1 表示不限制重复次数:客户端运行时环境将一直尝试下去,直到成功建立连接或到达结束时间为止(以最先出现的情况为准)。
通过将连接工厂的 imqReconnectEnabled 属性设置为 true,可以使客户端在连接失败时自动重新连接到代理。imqReconnectAttempts 属性控制尝试重新连接到给定代理地址的次数;imqReconnectInterval 指定了两次尝试之间等待的时间间隔(以毫秒为单位)。
在代理地址列表 (imqAddressList ) 指定了多个地址的代理群集中,不但可以在原始代理上恢复失败的连接,而且还可以在群集中的其他代理上恢复失败的连接。如果重新连接到原始代理失败,则客户端运行时环境将尝试连接列表中的其他地址。imqAddressListBehavior 和 imqAddressListIterations 属性控制尝试连接地址的顺序和循环访问列表的次数,如前面一节所述。将以 imqReconnectInterval 的值(毫秒)作为时间间隔反复尝试连接每个地址,直到达到 imqReconnectAttempts 指定的最大尝试次数为止。
自动重新连接支持消息使用的所有客户端确认模式。重新建立连接之后,代理将重新传送以前传送过的所有未确认消息,并使用重新传送标志对其进行标记。应用程序代码可以使用此标志确定消息是否已使用但尚未得到确认。(但是,对于非长期订户,代理在关闭连接后不会保留消息。因此,在关闭连接时为这些订户生成的所有消息都将丢失,而不能在重新连接后进行传送。)在自动重新连接过程中将禁止生成消息;消息生成方无法向代理发送消息,直到重新建立连接为止。
自动重新连接提供连接故障转移,但不提供数据故障转移:客户端重新连接到其他代理实例时,因出现故障或断开连接的代理而保存的持久性消息和其他状态信息会丢失。尝试重新建立连接时,Message Queue 会维护客户端运行时环境提供的对象(如会话、消息使用方和消息生成方)。当连接失败时,系统也会维护临时目的地一段时间,因为客户端可能会重新连接并再次访问它们;在客户端重新连接并使用这些目的地之后,代理将会删除它们。如果重新连接时无法在代理上完全恢复客户端状态(例如,在使用事务会话时,客户端状态只在连接期间存在),将不会进行自动重新连接,而是调用该连接的异常处理程序。然后由应用程序代码捕获异常、重新连接并恢复状态。
可以将 Message Queue 客户端运行时环境配置成定期测试或 "ping" 连接,从而可以尽早检测出连接故障,以免在尝试传输消息时失败。对于只使用消息而不生成消息的客户端应用程序而言,这种测试尤为重要,因为如果不进行测试,这些应用程序将无法检测到连接失败。只是偶尔生成消息的客户端也可以利用此功能。
连接工厂属性 imqPingInterval 指定了 ping 连接的频率(以秒为单位)。默认情况下将此时间间隔设置为 30 秒;如果值为 -1,则表示禁用 ping 操作。
对失败的 ping 操作的响应因操作系统平台而异。在某些操作系统上,会立即向客户端应用程序的异常侦听器抛出异常。(如果客户端没有异常侦听器,则当它下次尝试使用连接时将会失败。)其他系统可能会继续尝试与代理建立连接,并缓冲后续的 ping 操作,直到某次尝试成功或缓冲区溢出为止。
表 16–4 中列出的连接工厂属性支持长期订户的客户端验证和客户端标识符设置。
必须对所有的代理连接尝试进行验证,方法是将用户名和密码与消息服务维护的用户系统信息库进行对照。连接工厂属性 imqDefaultUsername 和 imqDefaultPassword 指定了创建连接时使用的默认用户名和密码(如果客户端未明确提供它们)。
对于不希望在应用程序开发和测试期间填充用户系统信息库的开发者,为方便起见,Message Queue 提供了用户名和密码均为 guest 的 guest 用户帐户。这也是 imqDefaultUsername 和 imqDefaultPassword 属性的默认值,这样,如果未明确指定这些属性,客户端可以始终使用 guest 帐户获取连接。在生产环境中,只有在用户系统信息库中明确注册的用户,才应该访问代理连接。
根据 Java 消息服务规范的要求,当代理必须为客户端维护持久性状态时,连接必须提供一个唯一的客户端标识符。Message Queue 使用这些客户端标识符来跟踪主题目的地的长期订户。如果长期订户变为非活动状态,则代理会保留与该主题有关的所有传入消息,并在订户再次处于活动状态时传送这些消息。代理通过客户端标识符来标识订户。
客户端应用程序可以使用连接对象的 setClientID 方法以编程方式设置其自身的客户端标识符,这使得很难协调客户端标识符,从而不能确保每个标识符都是唯一的。通常,为客户端创建连接时,最好让 Message Queue 自动指定一个唯一的标识符。具体方法是,将连接工厂的 imqConfiguredClientID 属性设置为具有以下格式的值:
${u}factoryID
字符 ${u} 必须是该属性值的前四个字符。(如果大括号之间是 u 以外的任何字符,都会在创建连接时抛出异常;在任何其他位置,这些字符都没有特殊含义,将被视为纯文本。)factoryID 的值是唯一与此连接工厂对象关联的字符串。
为特定客户端创建连接时,Message Queue 通过将字符 ${u} 替换为 u:userName 来构建客户端标识符,其中 userName 是通过连接验证的用户名。这可以确保给定连接工厂创建的每个连接都有其自身的唯一客户端标识符,即使它们在其他所有方面都完全相同。例如,如果用户名为 Calvin,为连接工厂的 imqConfiguredClientID 属性指定的字符串为 ${u}Hobbes ,则指定的客户端标识符将为 u:CalvinHobbes。
如果两个客户端都尝试使用默认用户名 guest 获取连接,则此方案将不起作用,因为这两个客户端的客户端标识符具有相同的组成部分 ${u}。在这种情况下,只有请求连接的第一个客户端才能获取连接;第二个客户端的连接尝试将会失败,因为 Message Queue 不能创建两个具有相同客户端标识符的连接。
即使通过 imqConfiguredClientID 指定客户端标识符,客户端应用程序也可以使用连接方法 setClientID 来覆盖此设置。为了防止出现这种情况,可以将连接工厂的 imqDisableSetClientID 属性设置为 true。请注意,对于使用长期订户的应用程序,必须使用以下两种方法之一设置客户端标识符:使用 imqConfiguredClientID 以管理方式设置,或者使用 setClientID 以编程方式设置。
由于客户端发送和接收的“有效负荷”消息和 Message Queue 自身使用的控制消息(如代理确认消息)通过同一个客户端/代理连接进行传递,因此有效负荷流量过多将会干扰控制消息的传送。为了帮助缓解这个问题,可以使用表 16–5 中列出的连接工厂属性来管理两种消息的相对流量。这些属性分为以下四个类别:
确认超时指定等待代理确认的最长时间 (imqAckTimeout),超出此时间后将会抛出异常。
连接流计量通过将有效负荷消息拆分成具有指定大小 (imqConnectionFlowCount) 的若干批消息来限制有效负荷消息的传输,从而确保可以定期传送任何堆积的控制消息。
连接流控制限制有效负荷消息的数量 (imqConnectionFlowLimit),这些消息可以在连接上保持待处理状态,以等待使用。达到限制之后,将会暂停向连接传送有效负荷消息,直到等待使用的消息数低于该限制为止。此功能的使用受布尔标志 (imqConnectionFlowLimitEnabled) 控制。
使用方流控制限制有效负荷消息的数量 (imqConsumerFlowLimit),这些消息可以针对任何单个使用方保持待处理状态,以等待使用。 (也可以将此限制指定为特定队列目的地的属性 consumerFlowLimit。)达到该限制时,将会暂停向使用方传送有效负荷消息,直到等待使用的消息数(以 imqConsumerFlowLimit 的百分比表示)低于 imqConsumerFlowThreshold 属性指定的限制为止。这有助于防止同一连接上的任一使用方抢占其他使用方的流量,从而改善多个使用方之间的负载平衡。
使用上述流控制技术中的任何一种都需要在可靠性和吞吐量之间进行权衡;有关详细论述,请参见客户端运行时环境消息流调整。
表 16–6 列出了影响客户端队列浏览和服务器会话的连接工厂属性。imqQueueBrowserMaxMessagesPerRetrieve 属性指定了浏览队列目的地的内容时一次可以检索的最大消息数;imqQueueBrowserRetrieveTimeout 指定了等待检索消息的最长时间。(注意 imqQueueBrowserMaxMessagesPerRetrieve 不影响浏览消息的总数,只影响它们向客户端运行时环境传送时的分块方法:分成数量少但较大的块还是数量多但较小的块。客户端应用程序将总是接收队列中的所有消息。更改该属性的值可能会影响性能,但不会影响检索的数据总量。)布尔属性 imqLoadMaxToServerSession 管理应用服务器会话中连接使用方的行为:如果此属性的值是 true,客户端将向服务器会话中装入多个消息(消息数量不超过最大消息数);如果此属性的值是 false,则客户端一次只装入一条消息。
Java 消息服务规范定义了某些标准消息属性,JMS 提供者(如 Message Queue)可以选择是否支持这些属性。根据惯例,所有这些标准属性的名称均以字母 JMSX 开头。表 16–7 中列出的连接工厂属性控制 Message Queue 客户端运行时环境是否设置这些标准属性中的某些属性。对于生成的消息而言,这些属性包括:
JMSXUserID 发送消息的用户的标识
JMSXAppID 发送消息的应用程序的标识
JMSXProducerTXID 生成消息时所在的事务的事务标识符
对于使用的消息而言,这些属性包括:
JMSXConsumerTXID 使用消息时所在的事务的事务标识符
JMSXRcvTimestamp 消息传送到使用方的时间
对于某些 JMS 消息头字段,可以使用表 16–8 中列出的连接工厂属性来覆盖客户端设置的值。指定的设置将用于从该连接工厂获取的连接所生成的全部消息。可以采用这种方式覆盖的头字段包括:
上述每个字段都有两个属性:一个是布尔属性,用于控制是否可以覆盖字段,另一个用于指定字段的值。例如,用于设置优先级的属性是 imqOverrideJMSPriority 和 imqJMSPriority。此外还有一个属性 imqOverrideJMSHeadersToTemporaryDestinations,该属性控制覆盖值是否适用于临时目的地。
由于覆盖消息头可能会影响特定应用程序的需求,因此只有在咨询了应用程序的设计者或用户之后才应使用这些属性。
标识物理队列或主题目的地的目的地受管理对象只有两个属性,如表 16–9 中所示。一个重要属性是 imqDestinationName,该属性指定了此受管理对象表示的物理目的地的名称;此名称是使用 imqcmd create dst 命令(用于创建物理目的地)的 -n 选项指定的。(注意目的地受管理对象与它们表示的物理目的地之间不必是一对一的关系:单个物理目的地可以被多个受管理对象引用,也可以不被任何受管理对象引用。)此外,还有一个可选的描述性字符串 imqDestinationDescription,使用该字符串有助于标识目的地对象,将其与可能已经创建的其他对象区分开来。
使用 Message Queue 对象管理器实用程序 (imqobjmgr) 可以创建和管理受管理对象。imqobjmgr 命令提供了以下子命令,用于对受管理对象执行各种操作:
将受管理对象添加到对象存储库中
从对象存储库中删除受管理对象
列出对象存储库中现有的受管理对象
显示与受管理对象有关的信息
修改受管理对象的属性
有关 imqobjmgr 命令的语法、子命令和选项的参考信息,请参见对象管理器实用程序。
大部分对象管理器操作都要求将以下信息指定为 imqobjmgr 命令的选项:
这是客户端应用程序使用 Java 命名和目录接口在对象存储库中查找受管理对象时可以依据的逻辑名称。
有关可能属性及其值的信息,请参见对象存储库。
受管理对象的类型(-t 选项)
可能的类型包括:
队列目的地
主题目的地
连接工厂
队列连接工厂
主题连接工厂
分布式事务的连接工厂
分布式事务的队列连接工厂
分布式事务的主题连接工厂
SOAP 端点
受管理对象的属性(-o 选项)
有关可能属性及其值的信息,请参见受管理对象的属性。
imqobjmgr 命令的 add 子命令将连接工厂和主题或队列目的地的受管理对象添加到对象存储库中。存储在 LDAP 对象存储库中的受管理对象的查找名称必须以前缀 cn= 开头;文件系统对象存储库中的查找名称不必以任何特定前缀开头,但是不能包含正斜杠字符 (/)。
对象管理器仅列出并显示 Message Queue 受管理对象。如果对象存储库中应该包含一个非 Message Queue 对象,并且该对象与要添加的受管理对象具有相同的查找名称,则当您尝试执行添加操作时,将会收到一条错误消息。
要使客户端应用程序能够创建代理连接,请为要创建的连接类型添加连接工厂受管理对象:队列连接工厂或主题连接工厂。示例 8–1 显示了一条用于将队列连接工厂(受管理对象类型 qf)添加到 LDAP 对象存储库的命令。该对象具有查找名称 cn=myQCF,并通过 jms 连接服务连接到主机 myHost 上使用端口号 7272 运行的代理。
imqobjmgr add -l "cn=myQCF" -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=homerSimpson,ou=People,o=imq" -j "java.naming.security.credentials=doh" -j "java.naming.security.authentication=simple" -t qf -o "imqAddressList=mq://myHost:7272/jms" |
创建表示目的地的受管理对象时,最好先创建物理目的地,然后将受管理对象添加到对象存储库中。可以使用命令实用程序 (imqcmd) 创建物理目的地,如创建物理目的地中所述。
示例 8–2 中显示的命令将受管理对象添加到表示某个主题目的地的 LDAP 对象存储库,该主题目的地的查找名称为 myTopic,物理目的地名称为 physTopic。用于添加队列目的地的命令会很相似,但是受管理对象的类型(-t 选项)应该是 q(对应于 "queue destination")而不是 t(对应于 "topic destination")。
imqobjmgr add -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=homerSimpson,ou=People,o=imq" -j "java.naming.security.credentials=doh" -j "java.naming.security.authentication=simple" -t t -o "imqDestinationName=physTopic" |
示例 8–3 显示的是同一个命令,但是受管理对象存储库在 Solaris 文件系统而不是 LDAP 服务器中。
imqobjmgr add -l "cn=myTopic" -j "java.naming.factory.initial= com.sun.jndi.fscontext.RefFSContextFactory" -j "java.naming.provider.url=file:///home/foo/imq_admin_objects" -t t -o "imqDestinationName=physTopic" |
要从对象存储库中删除受管理对象,可以使用 imqobjmgr 命令的 delete 子命令,并指定要删除对象的查找名称、类型和位置。示例 8–4 中显示的命令用于删除在上述添加目的地中添加的对象。
imqobjmgr delete -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=homerSimpson,ou=People,o=imq" -j "java.naming.security.credentials=doh" -j "java.naming.security.authentication=simple" -t t |
使用对象管理器的 list 子命令,可以获取对象存储库中所有受管理对象或特定类型受管理对象的列表。示例 8–5 说明了如何列出 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=homerSimpson,ou=People,o=imq" -j "java.naming.security.credentials=doh" -j "java.naming.security.authentication=simple" |
示例 8–6 列出了所有队列目的地(类型为 q)。
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=homerSimpson,ou=People,o=imq" -j "java.naming.security.credentials=doh" -j "java.naming.security.authentication=simple" -t q |
query 子命令显示与指定的受管理对象有关的信息,该对象使用查找名称及包含该对象的对象存储库的属性来标识。示例 8–7 显示了与查找名称 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=homerSimpson,ou=People,o=imq" -j "java.naming.security.credentials=doh" -j "java.naming.security.authentication=simple" |
要修改受管理对象的属性,可以使用 imqobjmgr update 子命令。您应该提供该对象的查找名称和位置,并使用 -o 选项指定新的属性值。
修改受管理对象的属性更改在示例 8–8 中添加到对象存储库的队列连接工厂的 imqReconnectAttempts 属性值。
imqobjmgr update -l "cn=myQCF" -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=homerSimpson,ou=People,o=imq" -j "java.naming.security.credentials=doh" -j "java.naming.security.authentication=simple" -t qf -o "imqReconnectAttempts=3" |
使用 imqobjmgr 命令的 -i 选项可以指定命令文件的名称,命令文件使用 Java 属性文件语法来表示全部或部分子命令子句。此功能在指定对象存储库属性时尤为有用,通常,指定对象存储库属性时需要执行大量的键入操作,并且在多次调用 imqobjmgr 时指定属性的操作可能相同。使用命令文件还可以避免超出命令行所允许的最大字符数。
示例 8–9 说明了对象管理器命令文件的一般语法。请注意,version 属性不是命令行选项:它指的是命令文件自身的版本(而不是 Message Queue 产品的版本),因此必须将其值设置为 2.0。
version=2.0 cmdtype=[ add | delete | list | query | update ] obj.lookupName=lookup name objstore.attrs.objStoreAttrName1=value1 objstore.attrs.objStoreAttrName2=value2 . . . objstore.attrs.objStoreAttrNameN=valueN obj.type=[ q | t | cf | qf | tf | xcf | xqf | xtf | e ] obj.attrs.objAttrName1=value1 obj.attrs.objAttrName2=value2 . . . obj.attrs.objAttrNameN=valueN |
例如,请考虑前面示例 8–1 中显示的对象管理器命令,该命令将队列连接工厂添加到 LDAP 对象存储库。此命令可以封装在命令文件中,如示例 8–10 所示。如果将此命令文件命名为 MyCmdFile,则可以使用以下命令行来执行该命令:
imqobjmgr -i MyCmdFile
version=2.0 cmdtype=add obj.lookupName=cn=myQCF 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=homerSimpson,ou=People,o=imq objstore.attrs.java.naming.security.credentials=doh objstore.attrs.java.naming.security.authentication=simple obj.type=qf obj.attrs.imqAddressList=mq://myHost:7272/jms |
还可以仅使用命令文件指定 imqobjmgr 子命令子句部分,而在命令行上明确提供其余部分。例如,示例 8–11 中显示的命令文件仅指定了 LDAP 对象存储库的属性值。
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=homerSimpson,ou=People,o=imq objstore.attrs.java.naming.security.credentials=doh objstore.attrs.java.naming.security.authentication=simple |
然后,可以使用此命令文件在 imqobjmgr 命令中指定对象存储库,同时明确提供其余选项,如示例 8–12 所示。
imqobjmgr add -l "cn=myQCF" -i MyCmdFile -t qf -o "imqAddressList=mq://myHost:7272/jms" |
您可以根据使用的平台,从以下相应位置找到命令文件的其他示例:
Solaris:/usr/demo/imq/imqobjmgr Linux:/opt/sun/mq/examples/imqobjmgr Windows:IMQ_HOME/demo/imqobjmgr