Sun Java System Message Queue 是一种功能全面的消息服务,提供符合 Java Messaging Specification (JMS) 1.1 的可靠、异步的消息传送功能。此外,Message Queue 还提供 JMS 规范之外的许多功能,以满足大型企业部署的需要。
Message Queue 4.1 版增加了高可用性、Java 验证和授权服务 (Java Authentication and Authorization Service, JAAS)、使用固定 C 端口以及 Java Enterprise System Monitoring Framework 支持。它还增加了少量的增强功能和错误修复功能。本部分包含以下信息。
有关 Message Queue 4.0 中引入的功能的信息,请参见关于 Message Queue 4.0。
Message Queue 4.1 引入了高可用性(数据和服务可用性)代理群集、JAAS 支持以及各种其他次要功能。本部分介绍了这些功能,并提供了进一步的使用参考信息。
Message Queue 4.1 引入了高可用性群集,这些群集提供了数据可用性以及服务可用性。如果客户端与高可用性代理之间的连接断开,则会自动将其重新连接到群集中的另一个代理。提供新连接的代理将接管故障代理的持久性数据和状态,并继续为故障代理的客户端提供不间断的服务。您可以通过安全连接来运行高可用性代理。
高可用性代理要求使用高可用数据库 (Highly Available Database, HADB)。如果没有此类数据库,或者数据可用性对您并不重要,您可以继续使用传统群集,这些群集提供自动重新连接和服务可用性。
配置高可用性代理的过程非常简单:您可以为群集中的每个代理指定以下类型的代理属性。
群集成员属性,它们指定代理是高可用性群集的一部分,并指定群集 ID 以及代理 ID。
高可用数据库 (HADB) 属性,它们为数据库指定了持久性消息模型 (JDBC)、HADB 供应商名称以及特定于供应商的配置属性。
故障检测和接管属性,它们指定了应如何检测和处理代理故障。
要使用此功能,您必须执行以下操作:
安装高可用数据库。
安装 JDBC 驱动程序的 .jar 文件。
为高可用的持久性存储库创建数据库模式。
为群集中的每个代理设置与高可用性相关的属性。
启动群集中的每个代理。
有关高可用性以及将其与传统群集进行对比的概念性讨论,请参见《Sun Java System Message Queue 4.1 Technical Overview》中的第 4 章 “Broker Clusters”。有关高可用性的过程和参考信息,请参见《Sun Java System Message Queue 4.1 Administration Guide》中的第 8 章 “Broker Clusters”和《Sun Java System Message Queue 4.1 Administration Guide》中的“Cluster Configuration Properties”。
如果将 HADB 数据库与 Message Queue 4.0 版一起使用,并且要使用高可用性群集,则可以使用 dbmgr 实用程序升级到 HADB 共享存储库。有关详细信息,请参见代理群集。
除了基于文件的内置验证机制以及基于 LDAP 的内置验证机制外,Message Queue 还支持 Java 验证和授权服务 (Java Authentication and Authorization Service, JAAS),它允许将各种服务插入到代理中以验证 Message Queue 客户端。本部分介绍了代理为符合 JAAS 的验证服务提供的信息,并且说明了如何配置代理以使用此类服务。
而介绍 JAAS API 则超出了本文档的范围。如果需要了解更多信息,请参考以下资源。
有关 JAAS API 的完整信息,请参见《Java Authentication and Authorization Service (JAAS) Reference Guide》。
http://java.sun.com/j2se/1.5.0/docs/guide/security/jaas/JAASRefGuide.html
有关编写 LoginModule 的信息,请参见《 Java Authentication and Authorization Service (JAAS) LoginModule Developer's Guide》。
http://java.sun.com/j2se/1.5.0/docs/guide/security/jaas/JAASLMDevGuide.html
JAAS API 是 J2SE 中的核心 API,因此, 它是 Message Queue 运行环境中的一个不可或缺的组成部分。JAAS 在应用程序和验证机制之间定义了一个抽象层,它无需更改应用程序代码即可插入所需的机制。对于 Message Queue 服务,抽象层位于代理(应用程序)和验证提供者之间。通过设置几个代理属性,您可以插入任何符合 JAAS 的验证服务并升级此服务,而不会产生中断或需要更改代理代码。
如果使用的是基于 JAAS 的验证,则可以使用 JMX 客户端来管理代理,但必须先手动设置 JAAS 支持(通过设置与 JAAS 相关的代理属性),然后才能启动代理。无法使用 JMX API 更改这些属性。
图 1–1 显示了 JAAS 的基本元素:JAAS 客户端、符合 JAAS 的验证服务以及 JAAS 配置文件。
JAAS 客户端是一个应用程序,它需要使用符合 JAAS 的验证服务来执行验证。它使用 LoginModule 与此服务进行通信并负责提供回调处理程序,LoginModule 可以调用此处理程序以获取用户名、密码以及其他相关信息。
符合 JAAS 的验证服务包含一个或多个 LoginModule 以及执行所需验证的逻辑。LoginModule 可以包含验证逻辑,也可以使用专用协议或 API 与提供该逻辑的模块进行通信。
JAAS 配置文件是一个文本文件,JAAS 客户端使用该文件来查找与 JAAS 服务进行通信所需的LoginModule。
下一部分说明了 Message Queue 服务如何使用这些元素来提供符合 JAAS 的验证。
下图说明了 Message Queue 代理如何使用 JAAS。它显示了上图所示的 JAAS 模型的更复杂实现。
与更简单的示例所显示的一样,验证服务层与代理是分开的。验证服务包含一个或多个登录模块 (LoginModule) 以及附加验证模块(如果需要)。登录模块在与代理相同的 Java 虚拟机中运行。对于登录模块来说,Message Queue 代理表示为 LogInContext,并通过 CallBackHandler(作为代理运行时代码的一部分)与登录模块进行通信。
验证服务还提供一个 JAAS 配置文件,其中包含登录模块的入口。该配置文件指定了这些模块的使用顺序以及一些使用条件。在代理启动时,JAAS 通过 Java 系统属性 java.security.auth.login.config 或 Java 安全属性文件来查找该配置文件。然后,它根据代理属性 imq.user_repository.jaas.name 的值在 JAAS 配置文件中选择一个入口。该入口指定将用于验证的登录模块。正如图中所示,代理可以使用多个登录模块。(图 1–3 显示了配置文件、登录模块和代理之间的关系。)
代理使用 JAAS 插件验证服务这一情况对 Message Queue 客户端来说仍是完全透明的。客户端继续像以前一样连接到代理,以便传递用户名和密码。反过来,代理使用回调处理程序将此信息传递给验证服务,该服务使用此信息验证用户并返回结果。如果验证成功,代理将允许建立连接;如果失败,客户端运行时环境将返回 JMS 安全异常,客户端必须对其进行处理。
验证 Message Queue 客户端后,如果要进行进一步授权,代理将按正常方式继续操作;它将查看访问控制文件,以确定是否授权经过验证的客户端执行它要完成的操作:访问目的地、使用消息和浏览队列等。
设置符合 JAAS 的验证的过程包括设置一些代理和系统属性,以便选择这种验证类型、指定配置文件位置以及指定要使用的登录模块入口。
本部分说明了 JAAS 客户端、登录模块和 JAAS 配置文件是如何相互关联的,然后介绍了设置符合 JAAS 的验证所需的过程。下图显示了配置文件、登录模块和代理之间的关系。
正如图中所示,JAAS 配置文件 MyJAASCFile.config 包含对几个登录模块(组合在一个入口点中)的引用。代理通过查看 Java 系统属性 java.security.auth.login.config 或 Java 安全属性文件来查找配置文件。要使用的登录模块是通过查看代理属性 imq.user_repository.jaas.name 确定的,该属性指定配置文件中的所需入口。可以在 lib/ext 目录中找到这些模块的类。
要为 Message Queue 设置 JAAS 支持,您必须完成以下步骤。(在开发环境中,可以由开发者完成所有这些步骤。在生产环境中,将由管理员完成其中的某些任务。)
创建一个或多个用于实现验证服务的登录模块类。下面列出了代理支持的 JAAS 回调类型。
代理使用此回调为验证服务传递代理运行的语言环境。可以使用该值来进行本地化。
代理使用此回调为验证服务传递 Message Queue 客户端在请求连接时指定的用户名。
当 TextInputCallback.getPrompt() 为 imq.authentication.type 时,代理使用此回调为验证服务指定 imq.authentication.type 的值。目前,此字段的值只能为 basic。这表示使用 Base-64 密码编码。
代理使用此回调为验证服务传递 Message Queue 客户端在请求连接时指定的密码。
通过将文本输出记录到代理日志文件中,代理使用此回调为验证服务提供日志记录服务。回调的消息类型 ERROR、INFORMATION、WARNING 分别映射到代理日志级别 ERROR、INFO 和 WARNING。
使用引用登录模块类的入口创建 JAAS 配置文件,并为 Message Queue 管理员指定此文件的位置。(可以远程查找该文件,并且可以使用 url 指定其位置。)
记下 JAAS 配置文件中的入口(它引用登录实现类)的名称。
将用于实现登录模块的类归档为 jar 文件,然后将 jar 文件放在 Message Queue 的 lib/ext 目录中。
配置与 JAAS 支持相关的代理属性。表 1–2 对此进行了描述。
设置以下系统属性以指定 JAAS 配置文件的位置。
java.security.auth.login.config= JAAS_Config_File_Location
例如,可以在启动代理时指定配置文件。
imqbrokerd -Djava.security.auth.login.config=JAAS_Config_File_Location
可以使用其他方法来指定 JAAS 配置文件的位置。有关其他信息,请参见
http://java.sun.com/j2se/1.5.0/docs/guide/security/jaas/tutorials/LoginConfigFile.html
下表列出了设置 JAAS 支持所需的代理属性。
表 1–2 用于 JAAS 支持的代理属性
属性 |
描述 |
---|---|
imq.authentication.type |
设置为 basic 以表示使用 Base-64 密码编码。这是 JAAS 验证唯一允许的值。 |
imq.authentication.basic.user_repository |
设置为 jaas 以指定 JAAS 验证。 |
imq.accesscontrol.type |
设置为 file。 |
imq.user_repository.jaas.name |
设置为 JAAS 配置文件中的所需入口的名称,该入口引用要用作验证机制的登录模块。这是在步骤 3 中记下的名称。 |
imq.user_repository.jaas.userPrincipalClass |
此属性(由 Message Queue 访问控制使用)指定登录模块中的 java.security.Principal 实现类,代理使用该类来提取主体名称,以表示 Message Queue 访问控制文件中的用户实体。如果未指定此属性,则改用在请求连接时从 Message Queue 客户端传递的用户名。 |
imq.user_repository.jaas.groupPrincipalClass |
此属性(由 Message Queue 访问控制使用)指定登录模块中的 java.security.Principal 实现类,代理使用该类来提取主体名称,以表示 Message Queue 访问控制文件中的组实体。如果未指定此属性,则忽略 Message Queue 访问控制文件中的组规则(如果有)。 |
Message Queue 4.1 版更改了 JDBC 存储库以支持高可用性。因此,JDBC 存储库版本已提高到 410。JDBC 存储库版本 350、370 和 400 将自动迁移到 410 版本模式。
请注意,基于文件的持久性存储库版本仍保持为 370,因为未对此版本进行任何更改。
已将 IMQ_DEFAULT_EXT_JARS 属性添加到 imqenv.conf 文件中。可以设置此属性,以指定在代理启动时包含在 CLASSPATH 中的外部 .jar 文件的路径名。如果使用此属性指定外部 .jar 文件的位置,则不再需要将这些文件复制到 lib/ext 目录中。外部 jar 可以指 JDBC 驱动程序,也可以指 JAAS 登录模块。下面的样例命令指定了 jdbc 驱动程序的位置。
IMQ_DEFAULT_EXT_JARS=/opt/SUNWhadb4/lib/hadbjdbc4.jar:/opt/SUNWjavadb/derby.jar
Message Queue 支持 Sun Java Enterprise System (JES) Monitoring Framework,它允许使用通用图形界面来监视 Java Enterprise System 组件。此界面是由一个基于 Web 的控制台(名为 Sun Java System Monitoring Console)实现的。如果将 Message Queue 与其他 JES 组件一起运行,您可能会发现使用单个界面来管理所有这些组件要更方便一些。
JES 监视框架定义了所有 JES 组件产品使用的通用数据模型 (Common Data Model, CMM)。此模型为所有 JES 组件实现了集中且统一的视图。Message Queue 向 JES 监视框架公开以下对象:
安装的产品
代理实例名称
代理端口映射器
每个连接服务
每个物理目的地
持久性存储库
用户系统信息库
其中的每个对象将映射到 CMM 对象,可以使用 JES 监视控制台来监视 CMM 对象的属性。在运行时,管理员可以使用控制台来查看性能统计信息、创建规则(以自动进行监视)以及确认警报。有关将 Message Queue 对象映射到 CMM 对象的详细信息,请参见 Sun Java Enterprise System 监视指南。
要启用 JES 监视,您必须执行以下操作:
按照 Sun Java Enterprise System 安装指南中提供的说明,安装并配置部署中的所有组件(Message Queue 和其他组件)。
按照 Sun Java Enterprise System 监视指南中所述,为所有监视的组件启用并配置 Monitoring Framework。
按照 Sun Java Enterprise System 监视指南中所述,在单独的主机上安装监视控制台,启动主代理,然后启动 Web 服务器。
使用 JES Monitoring Framework 并不会影响代理性能,因为收集度量的全部工作都是由监视框架完成的,它从代理的现有监视数据基础结构中提取数据。
以前,仅允许通过管理方式回滚处于 PREPARED 状态的事务。也就是说,如果作为分布式事务一部分的会话没有正常终止,代理管理员将无法清除处于某种状态的事务。在 Message Queue 4.1 中,可使用 imqcmd 实用程序清除(回滚)处于以下状态的事务:STARTED、FAILED、INCOMPLETE、COMPLETE、PREPARED。
为帮助您确定能否回滚特定事务(特别是未处于 PREPARED 状态时),imqcmd 实用程序提供了额外的数据作为 imqcmd query txn 输出的一部分:它为启动事务的连接提供连接 ID,并指定事务的创建时间。通过使用此信息,管理员可以确定是否需要回滚事务。通常,管理员应避免提前回滚事务。
C 客户端可以使用 MQ_SERVICE_PORT_PROPERTY 连接属性来指定要连接到的固定端口。如果尝试通过防火墙或者需要绕过代理的端口映射器服务(用于动态分配端口),这可能是非常有用的。
请记住,还需要在代理端配置 JMS 服务端口。例如,如果要通过 ssljms 将客户端连接到端口 1756,您应该执行以下操作。
在客户端:将 MQ_SERVICE_PORT_PROPERTY 设置为 1756,然后将 MQ_CONNECTION_TYPE_PROPERTY 设置为 SSL。
在代理端:将 imq.serviceNameType.protocol .port 属性设置为 1756,如下所示。
imq.ssljms.ssl.port=1756
MQ_SERVICE_PORT_PROPERTY 连接属性是在 Message Queue 3.7 版 Update 2 中引入的。
有关 4.1 版的硬件和软件要求,请参阅《Sun Java System Message Queue 4.1 Installation Guide》。