Sun Java 徽标     上一页      目录      索引      下一页     

Sun 徽标
Sun Java System Message Queue 3 2005Q4 管理指南 

第 8 章
管理受管理对象

受管理对象封装特定于提供者的配置和命名信息,以便开发可以从一个 JMS 提供者移植到另一个 JMS 提供者的客户端应用程序。通常,Message Queue 管理员为客户端应用程序创建受管理对象,以便在获取用于发送和接收消息的代理连接时使用。

本章介绍了如何使用对象管理器实用程序 (imqobjmgr) 来创建和管理受管理对象。本章包含以下各节:


对象存储

受管理对象放在易于使用的对象存储中,客户端应用程序可以通过 Java 命名和目录接口 (Java Naming and Directory Interface, JNDI) 从该对象存储中访问这些对象。可以使用两种类型的对象存储:标准的轻量目录访问协议 (Lightweight Directory Access Protocol, LDAP) 目录服务器或本地文件系统中的目录。

LDAP 服务器对象存储

对于生产消息传送系统,建议将 LDAP 服务器用作对象存储。LDAP 服务器针对分布式系统而设计,它提供了在生产环境中非常有用的安全功能。

许多供应商都提供 LDAP 实现。要使用 Message Queue 管理工具管理 LDAP 服务器上的对象存储,可能首先需要配置服务器,使其可以存储 Java 对象并执行 JNDI 查找;有关详细信息,请参见随 LDAP 实现一起提供的文档。

要将 LDAP 服务器用作对象存储,必须指定表 8-1 中所示的属性。这些属性分为以下几个类别:

文件系统对象存储

Message Queue 也支持将本地文件系统中的目录用作受管理对象的对象存储。虽然不建议在生产系统中使用这种方法,但该方法的优点是非常易于在开发环境中使用。但是,请注意,如果要将目录用作部署于多个计算机节点上的客户端的集中式对象存储,则所有这些客户端都必须能够访问该目录。此外,可以访问该目录的所有用户均可使用 Message Queue 管理工具来创建和管理受管理对象。

要将文件系统目录用作对象存储,必须指定表 8-2 中所示的属性。这些属性与上述 LDAP 对象存储属性的一般含义相同;不同的是,java.naming.provider.url 属性指定保存该对象存储的目录的路径。此目录必须存在,并且 Message Queue 管理工具用户以及将访问该存储的客户端应用程序用户必须对该目录具有正确的访问权限。

表 8-2 文件系统对象存储属性 

属性

描述

java.naming.factory.initial

JNDI 查找的初始上下文

示例:

com.sun.jndi.fscontext.RefFSContextFactory

java.naming.provider.url

目录路径

示例:

file:///C:/myapp/mqobjs


受管理对象的属性

Message Queue 受管理对象有两种基本类型:

上述每种类型的受管理对象都具有一些特定属性,用于确定对象的属性和行为。本节介绍了如何使用对象管理器命令行实用程序 (imqobjmgr) 来设置这些属性;也可以使用 GUI 管理控制台进行设置,如第 2 章中所述(请参见使用受管理对象)。

连接工厂属性

客户端应用程序使用连接工厂受管理对象来创建与代理交换消息时使用的连接。连接工厂的属性定义了它所创建的所有连接的属性。创建连接之后,将无法更改其属性;因此,配置连接属性的唯一方法就是设置用于创建连接的连接工厂的属性。

Message Queue 定义了两类连接工厂对象:

这两类对象共享相同的配置属性,可以通过这些属性来优化资源、性能和消息吞吐量。第 16 章“受管理对象属性参考”详细列出并说明了这些属性,以下各节将对这些属性进行讨论:

连接处理

连接处理属性指定了要连接到的消息服务器地址,以及如何检测连接故障并尝试重新连接(如果要求)。表 16-1 概要介绍了这些属性。

消息服务器地址列表

最重要的连接处理属性是 imqAddressList,该属性指定了要与之建立连接的一个或多个代理。该属性的值是一个字符串,它包含一个消息服务器地址或者以逗号分隔的多个地址(如果是代理群集)。服务器地址可以使用各种寻址方案,具体情况取决于要使用的连接服务(请参见连接服务)和建立连接的方法:

表 16-2 概要介绍了这些寻址方案。

每个消息服务器地址的通用格式为:

scheme://address

其中 scheme 是上面列出的寻址方案之一,而 address 表示服务器地址本身。用于指定地址的准确语法因寻址方案而异,如表 16-2 中的最后一列所示。表 16-3 提供了各种地址格式的示例。

在多代理群集环境中,地址列表可能包含多个服务器地址。如果第一次连接尝试失败,Message Queue 客户端运行时将尝试连接到列表中的另一个地址,依此类推,直到尝试完列表中的所有地址为止。其他两个连接工厂属性控制上述操作的执行方式:

自动重新连接

通过将连接工厂的 imqReconnectEnabled 属性设置为 true,可以使客户端在连接失败时自动重新连接到代理。imqReconnectAttempts 属性控制尝试重新连接到给定服务器地址的次数;imqReconnectInterval 指定了两次尝试之间等待的时间间隔(以毫秒为单位)。

在消息服务器地址列表 (imqAddressList) 指定了多个地址的代理群集中,不但可以在原始代理上恢复失败的连接,而且还可以在群集中的其他代理上恢复失败的连接。如果重新连接到原始代理失败,则客户端运行时将尝试连接列表中的其他地址。imqAddressListBehaviorimqAddressListIterations 属性控制尝试连接地址的顺序和循环访问列表的次数,如前面一节所述。将以 imqReconnectInterval 毫秒的时间间隔反复尝试连接每个地址,直到达到 imqReconnectAttempts 指定的最大尝试次数为止。

自动重新连接支持消息使用的所有客户端确认模式。重新建立连接之后,代理将重新传送以前传送过的所有未确认消息,并使用重新传送标志对其进行标记。应用程序代码可以使用此标志确定消息是否已使用但尚未得到确认。(但是,对于非长期订户,消息服务器在关闭连接后不会保留消息。因此,在关闭连接时为这些订户生成的所有消息都将丢失,而不能在重新连接后进行传送。)在自动重新连接过程中将禁止生成消息;消息生成方无法向服务器发送消息,直到重新建立连接为止。

自动重新连接提供连接故障转移,但不提供数据故障转移:客户端重新连接到其他代理实例时,出现故障或断开连接的代理所保存的持久性消息和其他状态信息会丢失。尝试重新建立连接时,Message Queue 确实会维护客户端运行时提供的对象(如会话、消息使用方和消息生成方)。当连接失败时,系统也会维护临时目标一段时间,因为客户端可能会重新连接并再次访问它们;在客户端重新连接并使用这些目标之后,代理将会删除它们。如果重新连接时无法在代理上完全恢复客户端状态(例如,在使用事务会话时,客户端状态只在连接期间存在),将不会进行自动重新连接,而是调用该连接的异常处理程序。然后由应用程序代码捕获异常、重新连接并恢复状态。

定期测试 (ping) 连接

可以将 Message Queue 客户端运行时配置成定期测试或 "ping" 连接,从而可以尽早检测出连接故障,以免在尝试传输消息时失败。对于只使用消息而不生成消息的客户端应用程序而言,这种测试尤为重要,因为如果不进行测试,这些应用程序将无法检测到连接失败。只是偶尔生成消息的客户端也可以利用此功能。

连接工厂属性 imqPingInterval 指定了 ping 连接的频率(以秒为单位)。默认情况下将此时间间隔设置为 30 秒;如果值为 -1,则表示禁用 ping 操作。

对失败的 ping 操作的响应因操作系统平台而异。在某些操作系统上,会立即向客户端应用程序的异常侦听器抛出异常。(如果客户端没有异常侦听器,则当它下次尝试使用连接时将会失败。)其他系统可能会继续尝试与代理建立连接,并缓冲后续的 ping 操作,直到某次尝试成功或缓冲区溢出为止。

客户端身份验证

表 16-4 中列出的连接工厂属性支持长期订户的客户端验证和客户端标识符设置。

客户端验证

必须对所有的代理连接尝试进行验证,方法是将用户名和密码与消息服务器维护的用户系统信息库进行对照。连接工厂属性 imqDefaultUsernameimqDefaultPassword 指定了创建连接时使用的默认用户名和密码(如果客户端未明确提供它们)。

对于不希望在应用程序开发和测试期间填充用户系统信息库的开发者,为方便起见,Message Queue 提供了用户名和密码均为 guest 的 guest 用户帐户。这也是 imqDefaultUsernameimqDefaultPassword 属性的默认值,这样,如果未明确指定这些属性,客户端可以一直使用临时帐户获取连接。在生产环境中,只有在用户系统信息库中明确注册的用户,才应该访问代理连接。

客户端标识符

根据 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 中列出的连接工厂属性来管理两种消息的相对流量。这些属性分为以下四个类别:

使用上述流控制技术中的任何一种都需要在可靠性和吞吐量之间进行权衡;有关详细论述,请参见客户端运行时消息流调整

队列浏览器和服务器会话

表 16-6 列出了影响客户端队列浏览和服务器会话的连接工厂属性。imqQueueBrowserMaxMessagesPerRetrieve 属性指定了浏览队列目标的内容时一次可以检索的最大消息数;imqQueueBrowserRetrieveTimeout 指定了等待检索消息的最长时间。布尔属性 imqLoadMaxToServerSession 管理应用服务器会话中连接使用方的行为:如果此属性的值是 true,客户端将向服务器会话中装入多个消息(消息数量不超过最大消息数);如果此属性的值是 false,则客户端一次只装入一条消息。

标准消息属性

Java 消息服务规范定义了某些标准消息属性,JMS 提供者(如 Message Queue)可以选择是否支持这些属性。根据惯例,所有这些标准属性的名称均以字母 JMSX 开头。表 16-7 中列出的连接工厂属性控制 Message Queue 客户端运行时是否设置这些标准属性中的某些属性。对于生成的消息而言,这些属性包括:

对于使用的消息而言,这些属性包括:

消息头覆盖

对于某些 JMS 消息头字段,可以使用表 16-8 中列出的连接工厂属性来覆盖客户端设置的值。指定的设置将用于从该连接工厂获取的连接所生成的全部消息。可以采用这种方式覆盖的头字段包括:

上述每个字段都有两个属性:一个是布尔属性,用于控制是否可以覆盖字段,另一个用于指定字段的值。例如,用于设置优先级的属性是 imqOverrideJMSPriorityimqJMSPriority。此外还有一个属性 imqOverrideJMSHeadersToTemporaryDestinations,该属性控制覆盖值是否适用于临时目标。


由于覆盖消息头可能会影响特定应用程序的需求,因此只有在咨询了应用程序的设计者或用户之后才应使用这些属性。


目标属性

标识物理队列或主题目标的目标受管理对象只有两个属性,如表 16-9 中所示。一个重要属性是 imqDestinationName,该属性指定了此受管理对象表示的物理目标的名称;此名称是使用 imqcmd create dst 命令(用于创建物理目标)的 -n 选项指定的。此外,还有一个可选的描述性字符串 imqDestinationDescription,使用该字符串有助于标识目标对象,将其与可能已经创建的其他对象区分开来。


使用对象管理器实用程序

使用 Message Queue 对象管理器实用程序 (imqobjmgr) 可以创建和管理受管理对象。imqobjmgr 命令提供了以下子命令,用于对受管理对象执行各种操作:

有关 imqobjmgr 命令的语法、子命令和选项的参考信息,请参见对象管理器实用程序

大部分对象管理器操作都要求将以下信息指定为 imqobjmgr 命令的选项:

添加受管理对象

imqobjmgr 命令的 add 子命令将连接工厂和主题或队列目标的受管理对象添加到对象存储中。存储在 LDAP 对象存储中的受管理对象的查找名称必须以前缀 cn= 开头;文件系统对象存储中的查找名称不必以任何特定前缀开头,但是不能包含正斜杠字符 (/)。


对象管理器仅列出并显示 Message Queue 受管理对象。如果对象存储中应该包含一个非 Message Queue 对象,并且该对象与要添加的受管理对象具有相同的查找名称,则当您尝试执行添加操作时,将会收到一条错误消息。


添加连接工厂

要使客户端应用程序能够创建代理连接,请为要创建的连接类型添加连接工厂受管理对象:队列连接工厂或主题连接工厂。代码示例 8-1 显示了一条用于将队列连接工厂(受管理对象类型 qf)添加到 LDAP 对象存储的命令。该对象具有查找名称 cn=myQCF,并使用 jms 连接服务连接到在端口号为 7272 的主机 myHost 上运行的代理。连接服务

代码示例 8-1 添加连接工厂

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")。

代码示例 8-2 将目标添加到 LDAP 对象存储 

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 服务器中。

代码示例 8-3 将目标添加到文件系统对象存储

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 中显示的命令用于删除在上述代码示例 8-2 中添加的对象。

代码示例 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 服务器上的所有受管理对象。

代码示例 8-5 列出所有受管理对象

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)。

代码示例 8-6 列出特定类型的受管理对象

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 的对象有关的信息。

代码示例 8-7 查看受管理对象的信息 

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 更改在代码示例 8-1 中添加到对象存储的队列连接工厂的 imqReconnectAttempts 属性值。

代码示例 8-8 修改受管理对象的属性

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

代码示例 8-9 对象管理器命令文件语法 

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

代码示例 8-10 示例命令文件

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-12 中显示的命令文件仅指定了 LDAP 对象存储的属性值。

代码示例 8-11 部分命令文件 

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 所示。

代码示例 8-12 使用部分命令文件

imqobjmgr add

    -l "cn=myQCF"

   -i MyCmdFile

   -t qf

   -o "imqAddressList=mq://myHost:7272/jms"

您可以根据使用的平台,从以下相应位置找到命令文件的其他示例:



上一页      目录      索引      下一页     


文件号码: 819-3561。  版权所有 © 2005 Sun Microsystems, Inc. 保留所有权利。