![]() | |
Sun Java System Message Queue 3 2005Q1 管理指南 |
第 4 章
配置代理在代理实例启动时,其配置由一组配置文件和传送到 imqbrokerd 命令的选项管理。本章说明了配置文件和命令行选项如何交互以配置代理实例,介绍了每个代理组件的功能并列出了其配置属性,另外还说明了如何设置配置。
本章包含以下小节:
有关配置属性的完整参考信息,请参见第 14 章“代理属性参考”。
关于可配置的代理组件在 Message Queue 消息传送系统中,消息传送(从生产方客户机到目标,然后再从目标到一个或多个使用方客户机)由代理或以串连模式工作的代理实例群集来执行。
要执行消息传送,代理必须建立与客户机之间的通信通道、执行验证和授权、适当的路由消息、确保可靠传送并提供用于监视系统性能的数据。
为了实现其功能,代理使用了大量的内部组件,每个组件都在传送过程中担当着各自不同的角色。图 4-1 中说明了这些代理组件。
图 4-1 代理服务组件
消息路由器组件执行关键的消息路由和传送服务,而其他组件则提供重要的支持服务。表 4-1 简要说明了各个组件。
可以根据负荷条件、应用程序的复杂性等因素,配置这些组件以优化代理的性能。以下小节详细介绍了每个组件执行的功能以及可以设置以影响其行为的属性。
连接服务
Message Queue 代理支持与 Message Queue 应用程序客户机和 Message Queue 管理客户机的通信。各项连接服务是由其服务类型和协议类型指定的,如下所示:
表 4-2 列出了可从 Message Queue 代理获得的连接服务:
表 4-2 代理支持的连接服务
服务名称
服务类型
协议类型
jms
NORMAL
tcp
ssljms(企业版)
NORMAL
tls(其安全性基于 SSL)
httpjms(企业版)
NORMAL
http
httpsjms(企业版)
NORMAL
https(其安全性基于 SSL)
admin
ADMIN
tcp
ssladmin
ADMIN
tls(其安全性基于 SSL)
可以将代理配置为运行以上任一或全部连接服务。每个连接服务仅在由代理的主机名和端口号指定的特定端口上可用。默认情况下,启用 jms 和 admin 服务。
Message Queue 可动态地将某项连接服务映射到某一端口号,或者也可以显式地分配一个端口。每项服务都具有一个线程池管理器,并向通用端口映射器服务注册它本身,如图 4-2 所示。
图 4-2 连接服务支持
以下部分介绍连接服务与端口映射器及线程池管理器之间的关系。
端口映射器
Message Queue 提供了一个端口映射器,用于将端口分配到连接服务。端口映射器位于标准端口号 7676 上。当客户机与代理建立连接时,它先与端口映射器通信,请求获得已指定连接服务的端口号。
jms、ssljms、admin 和 ssladmin 连接服务的端口号可以是动态的,也可以是静态的。默认情况下,连接服务在启动时动态地配置其端口。或者,也可以为该服务指定一个静态端口,但一般不建议使用静态端口号。静态端口号通常只用于一些特殊情况,例如经过防火墙的连接。
分别使用表 C-1 和表 C-3(这两个表格位于附录 C“HTTP/HTTPS 支持”)中说明的属性来配置 httpjms 和 httpsjms 服务。
线程池管理器
每个连接服务都是多线程的,从而支持多个连接。这些连接所需的线程在线程池中进行维护,而线程池又由线程池管理器组件来管理。
通过配置线程池管理器,可以设置线程池中维护的线程的最大和最小数量。当连接需要线程时,这些线程将被添加到线程池中。当线程数量超过最小值时,系统将关闭变为空闲状态的线程,直到达到最小阈值,以节省内存资源。此值应该足够大,这样就不必不断创建新线程了。如果连接负荷较重,线程数量可能会增加,直到达到线程池的最大数量。此后,连接必须一直等待,直到某个线程可用。
线程池中的线程可专用于单个连接(专用模型),也可根据需要分配到多个连接(共享模型)。
专用模型 每个到代理的连接需要两个专用线程:一个用于处理连接收到的消息,另一个用于处理连接发出的消息。这样,连接的数量就被限制为线程池中最大线程数量的一半,但却提供了较高的性能。
共享模型(企业版) 只要发送或接收消息,连接就会由共享线程处理。由于每个连接不需要专用线程,此模型增加了连接服务可支持的连接数量,因而,也增加了代理可支持的连接数量。但这同时带来了共享线程相关的某些性能开销。线程池管理器使用一组分配器线程来监视连接活动并根据需要将连接分配到线程。可通过限制每个此类分配器线程所监视的连接的数量使此活动带来的性能开销最小化。
安全性
每个连接服务均支持特定的验证和授权(访问控制)功能(请参见安全性管理器)。
连接服务属性
以下是与连接服务相关的可配置属性:
- imq.service.activelist。在代理启动时将启动的连接服务的列表。
- imq.hostname。指定当有多个主机可用(例如,一台计算机中安装了多个网络接口卡)时所有连接服务将绑定到的主机。
- imq.portmapper.port。指定代理的主端口,即端口映射器所在的端口。
- imq.portmapper.hostname。指定当有多个主机可用时端口映射器将绑定到的主机。
- imq.portmapper.backlog 的值。指定端口映射器在拒绝请求之前可处理的并发请求的最大数量。该属性设置了可存储在操作系统待办事项中等待端口映射器处理的请求的数量。
- imq.service_name.protocol_type.port。仅适用于 jms、ssljms、admin 和 ssladmin 服务,指定命名的连接服务的端口号。
- imq.service_name.protocol_type.hostname。仅适用于 jms、ssljms、admin 和 ssladmin 服务,指定当有多个主机可用时命名的连接服务将绑定到的主机。
- imq.service_name.min_threads。指定线程数量,达到该数量后,线程池中将维护此数量的线程供命名的连接服务使用。
- imq.service_name. max_threads。指定线程数量,达到该数量后,新的线程将不会被添加到线程池中供命名的连接服务使用。
- imq.service_name.threadpool_model。指定线程是专用于特定的连接,还是根据命名的连接服务的需要由多个连接共享。
- imq.shared.connectionMonitor_limit。仅适用于共享线程池模型,指定分配器线程可监视的连接的最大数量。
有关这些属性的完整说明,请参见表 14-2。
消息路由器
使用支持的连接服务在客户机与代理之间建立起连接后,即可进行消息的路由和传送。
基本传送机制
广义来讲,代理处理的消息可分为两类:
如果收到的消息为 JMS 消息,代理会根据其目标是队列还是主题,将其路由到使用方客户机:
消息路由器将消息传送到其所有目标使用方后,将立即从内存中删除此消息。如果消息是持久性的,则消息路由器将其从代理的持久性数据存储库中删除。
可靠传送:确认和事务
如果增加了可靠传送要求,则刚才讨论的传送机制就会复杂得多。可靠传送涉及两个方面:
为了确保消息成功传送到代理及从代理传送出去,Message Queue 使用了大量响应控制消息。
例如,当生产方向目标发送 JMS 消息(有效负荷消息)时,代理给出接收到 JMS 消息的响应。(默认情况下,只有当生产方将 JMS 消息指定为持久性消息时,Message Queue 才会进行上述操作。)生产方客户机使用代理响应来确保对目标的传送成功。
同样,当代理将 JMS 消息传送到使用方时,使用方客户机会发回一个确认,说明它已接收并处理了此消息。客户机可以在创建会话对象时指定发送这些确认的自动程度和频率,但消息路由器在收到每个消息使用方(它向其传送消息,例如某个主题的每个订户)的确认之前,不会从内存中删除 JMS 消息。
如果某个主题有多个长期订阅,消息路由器会将每条 JMS 消息保留在该目标中,以便在每个长期订户变为活动使用方时将消息传送出去。
消息路由器会在接收客户机确认时进行记录,并且只有在接收到所有确认后才会删除 JMS 消息,除非在这之前 JMS 消息已过期。
另外,消息路由器会将代理响应发送回客户机,确认已接收到客户机确认。使用方客户机使用代理响应来确保代理不会多次传送 JMS 消息。如果代理无法接收客户机确认,就可能会出现这种情况。
如果代理没有接收到客户机确认并再次传送了 JMS 消息,此消息将被标注“重新传送”标志。通常,代理在以下情况下将重新传送 JMS 消息:
例如,如果队列的消息使用方在确认消息之前脱机,随后另一位使用方向队列进行了注册,则代理会向该新使用方重新传送未确认的消息。
上述客户机确认和代理响应同样适用于编组为事务的 JMS 消息传送。这种情况下,这些过程在事务级别以及各个 JMS 消息发送或接收级别运行。当提交事务时,将自动发送代理响应。
代理会跟踪事务,允许提交它们或在出现故障时回滚。该事务管理也支持本地事务(较大的分布式事务的一部分)。代理会一直跟踪这些事务的状态,直到它们被提交。当代理启动时,它会检查所有未提交的事务,在默认情况下,代理回滚未处于 PREPARED 状态的所有事务。如果设置了 imq.transaction.autorollback 属性,代理还会回滚处于 PREPARED 状态的事务。
可靠传送:持久性
可靠传送的另一个方面是确保在实际传送消息前,代理没有丢失消息或要传送的信息。通常,消息将始终保留在内存中,直到被传送或过期。但是,如果代理出现故障,这些消息就会丢失。
如果生产方客户机指定某一消息是持久性的,则消息路由器会将该消息传送到持久性管理器。持久性管理器将该消息存储到数据库或文件系统中(请参见持久性管理器),以便在代理出现故障时能够恢复该消息。
管理内存资源和消息流
代理的性能和稳定性取决于可用的系统资源以及资源(如内存)的使用效率。特别是,当消息的生成大大快于使用时,消息路由器可能无法承受大量的消息,可能会用光其所有内存资源。为防止这种情况,消息路由器使用了三级内存保护以在资源不足时保持操作系统运转:
单个目标的消息限制 可以设置物理目标属性,指定消息数量和消息所使用的总内存限制(请参见第 15 章“物理目标属性参考”)。也可以指定达到限制时消息路由器的行为。四种限制行为是:
系统范围消息限制 系统范围消息限制构成了第二道防线。可指定应用于系统中所有目标的系统范围限制:消息总数和所有消息占用的内存(请参见表 14-3)。如果达到了任何系统范围消息限制,消息路由器将拒绝新消息。
系统内存阈值 系统内存阈值是第三道防线。可指定可用系统内存的阈值,代理可利用阈值采取更为进一步的操作以防内存过载。采取的操作取决于内存资源的状态,如下所示:
随着代理的内存状态由 green 变为 yellow,再变为 orange ,最后变为 red,代理所采取的措施也会越来越严格,操作类型如下:
- 将消息从活动内存交换到持久性存储器中(请参见持久性管理器)。
- 限制非持久性消息的生产方,最终会停止进入代理的消息流。持久性消息流自动受以下要求的限制:代理确认每一条消息。
这些措施都会降低性能。
如果达到系统内存阈值,则目标消息限制和系统范围消息限制都太小。在某些情况下,阈值无法及时捕获所有潜在的内存过载。因此,不应依赖此功能来控制内存资源,而是分别配置目标,共同优化内存资源。
消息路由器属性
以下是用于管理内存资源的系统范围限制和系统内存阈值:
- imq.destination.DMQ.truncateBody。指定停用消息队列只包括消息的标题和属性数据。废弃消息主体内容。
- imq.message.expiration.interval。指定过期消息的回收频率(以秒为单位)。
- imq.system.max_count。指定代理保留的消息的最大数量。
- imq.system.max_size。指定代理保留的消息总大小的最大值。
- imq.message.max_size。指定消息主体大小的最大值。
- imq.resource_state.threshold。指定将触发各个内存资源状态的内存占用百分比。
- imq.resource_state.count。指定当触发各个内存资源状态时允许同时处理的一批外来消息的最大数量。
- imq.transaction.autorollback。指定启动代理时,是否自动回滚处于 PREPARED 状态的分布式事务。
有关这些属性的完整说明,请参见表 14-3。
持久性管理器
对于发生故障后待恢复的代理,需要重新创建其消息传送操作的状态。这需要它将所有持久性消息以及基本的路由和传送信息保存到数据存储库中。持久性管理器组件用于管理此信息的写入和检索。
为了恢复出现故障的代理,不仅需要恢复未传送的消息,代理还必须完成以下操作:
持久性管理器用于管理所有这些状态信息的存储和检索。
当代理重新启动时,它将重新创建目标和长期订阅,恢复持久性消息和所有事务的状态,并重新创建未传送消息的路由表。然后代理才可以恢复消息传送。
Message Queue 既支持内置的持久性模块,也支持插入的持久性模块(请参见图 4-3)。内置的持久性是基于文件的数据存储库。插入的持久性使用 Java 数据库连接 (JDBC) 接口,并需要 JDBC 数据存储库。通常,内置的持久性比插入的持久性速度更快,但某些用户更希望获得使用 JDBC 兼容的数据库系统的冗余和管理功能。
图 4-3 持久性管理器支持
内置的持久性
默认的Message Queue 持久性存储器解决方案是基于文件的数据存储库。该解决方案使用单个文件来存储持久性数据,如消息、目标、长期订阅和事务等。
基于文件的数据存储库位于由与数据存储库相关联的代理实例的名称 (instanceName) 标识的目录内(请参见附录 A“Message Queue 数据在特定操作系统中的位置”):
.../instances/instanceName/fs350/
可构建基于文件的数据存储库,以便持久性消息所在的目标将其保存在目录中。大多数消息存储在由大小可变的记录组成的单个文件中。
为减少添加和删除消息带来的碎片,可压缩大小可变的记录文件(请参见压缩物理目标)。另外,内置的持久性管理器可在其各自的文件中存储大小超过配置阈值 (imq.persist.file.message.max_record_size) 的消息,而不是存储在大小可变的记录文件中。对于这些单个文件,可维护文件池以便重新使用这些文件。当不再需要某一消息文件时,并不会将其删除。而是将该消息文件添加到其目标目录下的空闲文件池中,用于存储新消息。
可配置目标文件池中文件的最大数量 (imq.persist.file.destination.message.filepool.limit)。也可以指定文件池中空闲文件所占的百分比,达到此百分比后将通过清空来清除文件池,而不是仅标记这些空闲文件供重复使用 (imq.persist.file.message.filepool.cleanratio)。随着清除文件的百分比增加,磁盘空间量逐渐减小,而维护文件池所需的开销却逐渐增加。
可以指定关闭时是否清除标记的文件 (imq.persist.file.message.cleanup)。如果清除这些文件,它们所占用的磁盘空间就会减少,但代理将需要更长的时间来进行关闭操作。
所有其他持久性数据(目标、长期订阅和事务)都存储在单独文件中:所有目标在一个文件中,所有长期订阅在另一个文件中,依此类推。
要最大限制地提高可靠性,可以使用 imq.persist.file.sync.enabled 属性指定持久性操作应使内存中状态与物理存储设备同步。这有助于消除因系统崩溃而导致的数据丢失,但代价是性能的下降。如果在 Sun Cluster 环境中运行 Message Queue,必须将群集中所有节点的该属性设置为 true。
因为数据存储库可能包含敏感或专用消息,所以应保护 instances/instanceName/fs350/ 目录以防止未经授权的访问。有关说明,请参见确保持久性数据的安全。
插入的持久性
您可以代理进行设置,以访问可通过 JDBC 驱动程序访问的任何数据存储库。这将设计到设置多个与 JDBC 相关的代理配置属性以及使用数据库管理器实用程序 (imqdbmgr) 来创建具有相应架构的数据存储库。设置持久性存储中详细说明了上述过程和相关的配置属性。
持久性管理器属性
该属性指定所使用的持久性的类型:
以下属性适合内置持久性:
- imq.persist.file.sync.enabled。指定持久性操作是否使内存中状态与物理存储设备同步。
- imq.persist.file.message.max_record_size。指定将要添加到消息存储文件中的消息大小的最大值。
- imq.persist.file.destination.message.filepool.limit。指定目标文件池中可供重复使用的空闲文件的最大数量。
- imq.persist.file.message. filepool.cleanratio。指定保持清除状态(清空)的目标文件池中空闲文件的百分比。
- imq.persist.file.message.cleanup。指定代理在关闭时是否清除目标文件池中的空闲文件。
有关这些属性的完整说明,请参见表 14-6。
以下属性适合基于 JDBC 的持久性:
- imq.persist.jdbc.brokerid。指定附加到数据库(由多个代理实例使用)中表名后面的代理实例标识符。
- imq.persist.jdbc.driver。指定连接到数据库的 JDBC 驱动程序的 Java 类名。
- imq.persist.jdbc.opendburl。指定打开现有数据库连接的数据库 URL。
- imq.persist.jdbc.createdburl。指定打开创建数据库连接的数据库 URL。
- imq.persist.jdbc.closedburl。指定关闭代理时关闭当前数据库连接的数据库 URL。
- imq.persist.jdbc.user。指定打开数据库连接的用户名(如果需要)。
- imq.persist.jdbc.needpassword。指定数据库是否要求输入为访问代理的密码。
- imq.persist.jdbc.password。指定用于打开数据库连接的密码(如果需要)。
- imq.persist.jdbc.table.IMQSV35。用于创建版本表的 SQL 命令。
- imq.persist.jdbc.table.IMQCCREC35。用于创建配置更改记录表的 SQL 命令。
- imq.persist.jdbc.table.IMQDEST35。用于创建目标表的 SQL 命令。
- imq.persist.jdbc.table.IMQINT35。用于创建 Interest 表的 SQL 命令。
- imq.persist.jdbc.table.IMQMSG35。用于创建消息表的 SQL 命令。
- imq.persist.jdbc.table.IMQPROPS35。用于创建属性表的 SQL 命令。
- imq.persist.jdbc.table.IMQILIST35。用于创建 Interest 状态表的 SQL 命令。
- imq.persist.jdbc.table.IMQTXN35。用于创建事务表的 SQL 命令。
- imq.persist.jdbc.table.IMQTACK35。用于创建事务确认表的 SQL 命令。
有关这些属性的完整说明,请参见表 14-7。
安全性管理器
Message Queue 提供验证和授权(访问控制)功能,同时也支持加密功能。
验证和授权功能取决于用户系统信息库(请参见图 4-4):包含消息传送系统的用户信息(用户名、密码和组成员资格)的文件、目录或数据库。用户名和密码用于在请求连接至代理时对用户进行验证。用户名和组成员资格(与访问控制文件配套使用)用于授权操作,例如为目标生成消息或使用目标的消息。
Message Queue 管理员可填充 Message Queue 提供的用户系统信息库(请参见使用平面文件用户系统信息库),也可以将原有的 LDAP 用户系统信息库插入到安全性管理器组件中(请参见使用 LDAP 服务器管理用户系统信息库)。
验证
Message Queue 安全性支持基于密码的验证。当客户机请求连接到代理时,该客户机必须提交用户名和密码。
安全性管理器将把客户机提交的用户名和密码与用户系统信息库中存储的用户名和密码进行比较。密码在从客户机传送到代理的过程中,将使用 Base 64 编码或消息摘要 (MD5) 进行编码。要想获得更安全的传送,请参见加密。可以分别配置每个连接服务使用的编码的类型,也可以基于代理范围设置编码方式。
安全性管理器属性中列出了所有安全管理器属性,并在安全性管理器属性中进行了详细说明。
授权
客户机应用程序的用户通过验证后,即可以获得授权来执行各种 Message Queue 相关的活动。安全性管理器既支持基于用户的访问控制,也支持基于组的访问控制。根据用户在用户系统信息库中分配到的用户名或组的不同,该用户所拥有的执行特定 Message Queue 操作的权限也不同。这些访问控制在访问控制属性文件中指定(请参见图 4-4)。
当用户尝试执行某个操作时,安全性管理器将检查该用户的用户名和组成员资格(通过用户系统信息库)是否属于被指定允许访问该操作的用户名或组成员资格(在访问控制属性文件中)。访问控制属性文件指定了执行以下操作的权限:
默认的访问控制属性文件只明确引用一个组:管理员(请参见组)。管理员组中的用户拥有管理服务连接权限。管理服务使用户可以执行管理功能,如创建目标以及监视和控制代理。默认情况下,您定义的其他任何组中的用户均无法获得管理服务连接。
作为 Message Queue 管理员,可以在用户系统信息库中定义组并使用户与这些组关联(虽然在平面文件用户系统信息库中不完全支持组)。
通过编辑访问控制属性文件,可以按照用户和组的不同目的(生成和使用消息,或浏览队列目标中的消息)指定对目标的权限。可以分别指定各个目标或指定所有目标仅能够被特定用户或组访问。如果将代理配置为允许自动创建目标,可编辑访问控制属性文件来控制代理可自动为其创建目标的用户和组。
安全性管理器属性中列出了所有安全管理器属性,并在安全性管理器属性中进行了详细说明。
加密
要对客户机和代理之间发送的消息进行加密,需要使用基于安全套接字层 (SSL) 标准的连接服务。SSL 通过在启用 SSL 的代理与启用 SSL 的客户机之间建立加密连接来提供连接级别的安全性。
为了使用 Message Queue 基于 SSL 的连接服务,需要使用密钥工具实用程序 (imqkeytool) 生成专用密钥/公用密钥对。此实用程序将公用密钥嵌入自签名的证书中,并将其放入 Message Queue 密钥库中。Message Queue 密钥库本身设有密码保护,要解除锁定,必须在启动时提供密钥库的密码。请参见使用基于 SSL 的服务。
解除密钥库的锁定后,代理即可将证书传送给所有请求连接的客户机。然后,客户机使用此证书建立与代理的加密连接。
下一节中列出了所有安全管理器属性,并在安全性管理器属性中进行了详细说明。
安全性管理器属性
以下是用于验证、授权、加密以及其他安全性通信的可配置属性。
- imq.authentication.type。指定传送密码时应使用 Base 64 编码 (basic) 还是 MD5 摘要 (digest)。
- imq.service_name. authentication.type。指定传送密码时应使用 Base 64 编码 (basic) 还是 MD5 摘要 (digest)。
- imq.authentication.basic.user_repository。对于 Base 64 编码,指定用于验证的用户系统信息库的类型(基于文件或 LDAP)。
- imq.authentication.client.response.timeout。指定系统等待客户机响应来自代理的验证请求的时间(以秒为单位)。
- imq.accesscontrol.enabled。表明系统是否要检查已验证的用户是否如访问控制属性文件所指定,拥有使用连接服务或执行与特定目标有关的特定 Message Queue 操作的权限。
- imq.service_name.accesscontrol.enabled。为命名的连接服务设置访问控制 (true/false),此设置将覆盖代理范围的设置。
- imq.accesscontrol.file.filename。为代理实例支持的所有连接服务指定访问控制属性文件的名称。
- imq.service_name.accesscontrol.file.filename。为代理实例的命名连接服务指定访问控制属性文件的名称。
- imq.passfile.enabled。指定是否在文件中指定用于安全性通信的用户密码(适用于 SSL、LDAP 和 JDBC )
- imq.passfile.dirpath。指定包含密码文件的目录的路径。
- imq.passfile.name。指定密码文件的名称。
- imq.keystore.property_name。适用于基于 SSL 的服务:指定与 SSL 密钥库相关的安全性属性。请参见表 14-9。
有关这些属性的完整说明,请参见表 14-8。
监视服务
代理包含大量用于监视和诊断其操作的组件。包括:
- 生成数据的组件(记录事件的代理代码和度量生成器)
- 通过多种输出通道记录输出信息的记录程序组件(请参见记录程序)
- 将包含度量信息的 JMS 消息发送到主题目标供 JMS 监视客户机使用的消息生产方。
图 4-5 中是通用方案的图解。
图 4-5 监视服务支持
度量生成器
度量生成器提供有关代理活动的信息,如流入流出代理的消息、代理内存中的消息数量及其使用的内存量、打开的连接数量和正在使用的线程数量。
可以打开或关闭度量数据的生成,并指定生成度量报告的频率。
记录程序
Message Queue 记录程序记录代理代码和度量生成器生成的信息,并将该信息写入多个输出通道中:标准输出(控制台)、日志文件以及 Solaris 操作系统上的 syslog 守护程序进程。
您可以指定记录程序所收集的信息类型以及写到每个输出通道的类型。
例如,可指定记录程序级别以确定记录程序收集的信息类型:错误 (ERROR);错误和警告 (WARNING);或错误、警告和信息 (INFO)。
可以分别指定写入到每个输出通道的记录程序的种类集。例如,如果将记录程序级别设置为 INFO,则可以指定只将错误和警告写入控制台,只将信息(度量数据)写入日志文件。
如果使用日志文件,可以指定何时关闭日志文件并将输出转移到新文件。创建新的转移日志文件时,将保留最新的 9 个日志文件的归档文件。
有关配置记录程序的信息,请参见配置和使用代理日志记录。有关配置和使用 Solaris syslog 的信息,请参见 syslog(1M)、syslog.conf(4) 和 syslog(3C) 手册页。
度量消息生产方(企业版)
消息生产方组件按一定的时间间隔接收度量生成器组件的信息。并将该信息写入消息,然后将其发送到度量主题目标。而度量消息发送到的目标取决于它所包含的信息类型。
共有五个度量主题目标,它们的名称以及传送到各个目标的度量消息的类型显示在表 4-3 中。
订阅这些度量主题目标的 Message Queue 客户机使用目标中的消息,并处理这些度量信息。例如,客户机可订阅 mq.metrics.broker 目标以接收和处理诸如代理中消息总数的信息。
度量消息生产方是一个内部 Message Queue 客户机,可创建包含与度量数据相对应的名称值对的消息(类型为 MapMessage)。仅当相应的度量主题目标有一个或多个订户时,才生成这些消息。
度量消息生产方生成的消息属于 MapMessage 类型。它们由许多名称/值对组成,取决于它们所包含的度量类型。每个名称/值对与度量数量及其值相对应。
例如,代理度量消息包含流入和流出代理的消息数量的值、这些消息的大小以及当前在内存中的消息数量和大小,等等。有关每种类型的度量消息中报告的度量数量的详细信息,请参见 Message Queue Developer's Guide for Java Clients。该手册介绍了如何向 Message Queue 客户机写入使用度量消息。
除了包含在度量消息主体中的度量信息之外,每条消息的标题还包含提供以下信息的属性:
以下属性对于处理不同类型(或来自不同代理)的度量消息的 Message Queue 客户机应用程序非常有用。
监视服务属性
以下是用于通过代理设置信息的生成、记录和度量消息生成的可配置属性。
- imq.metrics.enabled。指定是否要将度量信息写入记录程序。
- imq.metrics.interval。如果启用了度量日志记录,指定将度量信息写入记录程序的时间间隔(以秒为单位)。
- imq.log.level。指定记录程序级别:可以写入到输出通道的输出的种类。
- imq.log.file.output。指定写入到日志文件的日志记录信息的种类。
- imq.log.file.dirpath。指定包含日志文件的目录的路径。
- imq.log.file.filename。指定日志文件的名称。
- imq.log.file.rolloverbytes。指定日志文件的大小(以字节为单位),达到该大小后输出将转移到新的日志文件。
- imq.log.file.rolloversecs。指定日志文件的生存期(以秒为单位),达到该值后输出将转移到新的日志文件。
- imq.log.console.output。指定将哪些种类的日志记录信息写入到控制台。
- imq.log.console.stream。指定是否将控制台输出写入到标准输出 (OUT) 或标准错误 (ERR)。
- imq.log.syslog.facility。(仅对于 Solaris)指定 Message Queue 代理应将 syslog 记录为哪种系统日志工具。
- imq.log.syslog.logpid。(仅对于 Solaris)指定是否将代理进程 ID 与消息一起记录。
- imq.log.syslog.logconsole。(仅对于 Solaris)指定如果无法将消息发送到 syslog,是否将其写入到系统控制台。
- imq.log.syslog.identity。(仅对于 Solaris)此属性指定的标识字符串应添加到每个记录到 syslog 的消息的前面。
- imq.log.syslog.output。(仅对于 Solaris)指定将哪些种类的日志记录信息写入到 syslogd(1M)。
- imq.log.timezone。指定日志时间戳的时区。
- imq.metrics.topic.enabled。指定是否启用度量消息生成。
- imq.metrics.topic.interval。指定生成度量消息的时间间隔(以秒为单位)。
- imq.metrics.topic.persist。指定度量消息是否为持久性的。
- imq.metrics.topic.timetolive。指定生成度量消息(发送到度量主题目标)的生命周期(以秒为单位)。
- imq.destination.logDeadMsgs。指定代理是否在每次废弃一条停用消息或将停用消息放入停用消息队列中时,都在日志中写入一条消息。
有关这些属性的完整参考信息,请参见表 14-10。
关于配置文件代理配置文件用于配置代理。附录 A“Message Queue 数据在特定操作系统中的位置”中列出了这些配置文件在操作系统中所在的目录。
该目录存储以下文件:
实例配置文件
第一次运行代理时,将创建一个实例配置文件。使用实例配置文件为该代理实例指定配置属性。
实例配置文件存储在一个目录中,该目录用与此配置文件相关联的代理实例的名称 (instanceName) 标识:
…/instances/instanceName/props/config.properties
有关 instances 目录的位置,请参见附录 A“Message Queue 数据在特定操作系统中的位置”。
实例配置文件由代理实例维护。使用管理工具更改配置时,此文件也将被修改。您还可以手动编辑实例配置文件来更改配置(请参见编辑实例配置文件)。要完成此操作,您必须是 …/instances/instanceName 目录的拥有人或以超级用户身份登录,更改目录特权。
如果连接群集中的代理实例,则可能还需要使用群集配置文件来指定群集配置信息。有关详细信息,请参见群集配置属性。
合并属性值
启动时,代理会合并不同配置文件中的属性值。它将使用安装配置文件和实例配置文件中的值来覆盖默认配置文件中指定的值。
您可以用 imqbrokerd 命令选项来覆盖得到的值。图 4-6 所示为以上方案的图解。
图 4-6 代理配置文件
属性命名语法
配置文件中的所有 Message Queue 属性定义均使用以下命名语法:
propertyName=value[[,value1]…]
例如,下面的条目指定:在拒绝其他消息前,代理可以在内存和持久性存储器中最多保留 50,000 条消息:
imq.system.max_count=50000
下面的条目指定:将每天(86400 秒)创建一个新日志文件:
imq.log.file.rolloversecs=86400
第 14 章“代理属性参考” 中列出了代理配置属性及其默认值。
编辑实例配置文件首次运行代理实例时,系统将自动创建一个 config.properties 文件。您可以编辑该实例配置文件,以自定义相应代理实例的行为和资源使用。
代理实例仅在启动时读取 config.properties 文件。要对 config.properties 文件执行永久性更改,可执行以下任一操作:
- 使用管理工具。关于可以使用 imqcmd 设置的属性的信息,请参见表 14-1。
- 在代理实例关闭时编辑 config.properties 文件,然后重新启动实例。(在 Solaris 和 Linux 操作系统中,只有第一个启动代理实例的用户具有编辑 config.properties 文件的权限。)
表 14-1 按字母顺序列出了代理配置属性及其默认值。关于各个属性的含义和用法的更多信息,请参考指定的交叉参考的小节。
在命令行中输入配置选项在启动代理时(或之后),可以在命令行中输入代理配置选项。
启动时,请使用 imqbrokerd 命令启动代理实例。通过使用该命令的 -D 选项,可以指定任何代理配置属性及其值。如果使用 imqsvcadmin 命令将代理作为 Windows 服务启动,请使用 -args 选项指定启动配置属性。
代理实例运行时,也可以设置某些代理属性。要修改正在运行的代理的配置,请使用 imqcmd update bkr 命令。
有关启动配置的详细信息,请参见第 3 章“启动代理和客户机”,尤其是以交互方式启动代理中的示例。
有关修改正在运行的代理的配置的信息,请参见第 5 章“管理代理”和第 14 章“代理属性参考”。
设置持久性存储Message Queue 代理包含一个持久性管理器组件,该组件用于管理持久性信息的写入和检索。默认情况下,持久性管理器配置为访问基于文件的内置数据存储库,但是可以重新对其进行配置,以插入任何可通过 JDBC 兼容的驱动程序进行访问的数据存储库。
Message Queue 数据存储库中包含有关事务、消息、长期订阅和物理目标的信息。它还包含与确认相关的消息状态的信息。
本章介绍了如何设置代理以使用持久性存储。包括下列主题:
配置文件系统存储
创建代理实例时,将自动创建文件系统数据存储库。此存储位于该代理的实例目录中。该位置因操作系统而异;有关持久性存储具体位置的信息,请参见附录 A“Message Queue 数据在特定操作系统中的位置”。
默认情况下,Message Queue 执行非同步的磁盘写入操作。操作系统可以缓冲这些操作以提供良好的性能。但是,如果在两次写入操作之间出现意外的系统故障,则消息可能会丢失。要提高可靠性,可使 Message Queue 执行同步的磁盘写入操作。但要注意,此选项会导致性能降低。要指定同步的磁盘写入,请设置代理属性 imq.persist.file.sync。有关该属性的详细信息,请参见表 14-6。
启动代理实例时,可以使用 imqbrokerd -reset 选项清除文件系统存储。有关该选项及其子选项的详细信息,请参见表 13-2。
配置 JDBC 存储
要配置代理以使用基于 JDBC 的持久性,请在代理实例配置文件中设置与 JDBC 相关的属性,并创建相应的数据库模式。Message Queue 数据库管理器实用程序 (imqdbmgr) 使用 JDBC 驱动程序和代理配置属性来创建和管理数据库。
本章中介绍的步骤以 Java 2 Platform Enterprise Edition (J2EE) SDK 附带的 PointBase DBMS 为例进行说明。1.4 版本可以从 java.sun.com 下载。该示例使用 PointBase 的嵌入式版本(而不是客户机/服务器版本)。这些步骤以 PointBase 示例中的路径名和属性名为例进行说明。它们标有“示例:”字样。
Oracle 和 PointBase 的示例配置已可用。要查找这些示例文件,请参见附录 A“Message Queue 数据在特定操作系统中的位置”。在列出操作系统信息的表中,查找“示例应用程序和配置”的位置。
另外,PointBase 嵌入式版本、PointBase 服务器版本和 Oracle 的示例作为实例配置文件 config.properties 中的注释值提供。
插入 JDBC 可访问的数据存储库
插入 JDBC 可访问的数据存储库只需几个步骤。
插入 JDBC 可访问的数据存储库
- 在代理的配置文件中设置 JDBC 相关属性。
请参见基于 JDBC 的持久性中列出的属性文档。
- 在以下路径中放置一个 JDBC 驱动程序 jar 文件的副本或符号链接:
/usr/share/lib/imq/ext/ (Solaris)
/opt/sun/mq/share/lib/ (Linux)
IMQ_VARHOME\lib\ext (Windows)
副本示例 (Solaris):
% cp j2eeSDK_install_directory/pointbase/lib/pointbase.jar /usr/share/lib/imq/ext
符号链接示例 (Solaris):
% ln -s j2eeSDK_install_directory/lib/pointbase/pointbase.jar /usr/share/lib/imq/ext
- 创建 Message Queue 持久性所需的数据库模式。
使用 imqdbmgr create all 命令(对于嵌入式数据库)或者 imqdbmgr create tbl 命令(对于外部数据库)。请参见数据库管理器实用程序 (imqdbmgr)。
示例:
- 转到 imqdbmgr 所在的目录。
cd /usr/bin (Solaris)
cd /opt/sun/mq/bin (Linux)
cd IMQ_HOME/bin (Windows)
- 输入 imqdbmgr 命令。
imqdbmgr create all
注
如果使用嵌入式数据库,最好在以下目录中创建它:
…/instances/instanceName/dbstore/dabatabseName。
如果嵌入式数据库没有设置用户名和密码保护,则可能设置了文件系统权限保护。要确保代理能够对数据库进行读写操作,运行该代理的用户应该是使用 imqdbmgr 命令创建该嵌入式数据库的同一个用户(请参见数据库管理器实用程序 (imqdbmgr))。
JDBC 相关代理属性
代理的实例配置文件位于一个由代理实例名称所标识的目录中,而该实例名称与此配置文件是相关联的(请参见附录 A“Message Queue 数据在特定操作系统中的位置”):
…/instances/instanceName/props/config.properties
如果该文件尚不存在,必须使用 -name instanceName 选项启动代理,以便 Message Queue 创建该文件。
基于 JDBC 的持久性列出了插入 JDBC 可访问的数据存储库时需要设置的配置属性。在本节内容末尾对这些属性进行了汇总。在使用插入持久性的每个代理实例的实例配置文件 (config.properties) 中设置这些属性。
利用实例配置属性可以自定义用于创建 Message Queue 数据库架构的 SQL 代码:有一个可配置的属性可指定用于创建每个数据库表的 SQL 代码。要正确指定插入的数据库使用的数据类型,必须使用这些属性。
由于数据库供应商之间在具体的 SQL 语法方面存在不兼容问题,请务必检查数据库供应商提供的相应文档并对表 14-7 中的属性进行相应调整。例如,对于 PointBase 数据库,可能需要调整 IMQMSG35 表中 MSG 列所允许的最大长度(请参见 imq.persist.jdbc.table.IMQMSG35 属性)。
所有代理配置属性的值都可以使用 -D 命令行选项进行设置。如果某个数据库要求设置某些特定的数据库属性,也可以在启动代理 (imqbrokerd) 时使用 -D 命令行选项进行设置,或者使用数据库管理器实用程序 (imqdbmgr) 进行设置。
示例:
对于 PointBase 嵌入式数据库示例,可以使用 -D 命令行选项定义 PointBase 系统目录,而不是在数据库连接 URL 中指定数据库的绝对路径:
-Ddatabase.home=IMQ_VARHOME/instances/instanceName/dbstore
在这种情况下,可以指定 URL 以创建数据库,如下所示:
imq.persist.jdbc.createdburl=jdbc:pointbase:embedded:dbName;new
可以指定 URL 以打开数据库,如下所示:
imq.persist.jdbc.opendburl=jdbc:pointbase:embedded:dbName
下面是与 JDBC 相关的属性的汇总:
- imq.persist.store。指定基于文件或基于 JDBC 的数据存储库。
- imq.persist.jdbc.brokerid。指定附加到数据库表名后面的代理实例标识符,以使其具有唯一性。
- imq.persist.jdbc.driver。指定连接到数据库的 JDBC 驱动程序的 Java 类名。
- imq.persist.jdbc.opendburl。指定打开现有数据库连接的数据库 URL。
- imq.persist.jdbc.createdburl。指定打开创建数据库连接的数据库 URL。
- imq.persist.jdbc.closedburl。指定关闭代理时关闭当前数据库连接的数据库 URL。
- imq.persist.jdbc.user。指定打开数据库连接的用户名(如果需要)。
- imq.persist.jdbc.needpassword。指定数据库是否要求输入为访问代理的密码。
- imq.persist.jdbc.password。指定用于打开数据库连接的密码(如果需要)。
- imq.persist.jdbc.table.IMQSV35。用于创建版本表的 SQL 命令。
- imq.persist.jdbc.table.IMQCCREC35。用于创建配置更改记录表的 SQL 命令。
- imq.persist.jdbc.table.IMQDEST35。用于创建目标表的 SQL 命令。
- imq.persist.jdbc.table.IMQINT35。用于创建 Interest 表的 SQL 命令。
- imq.persist.jdbc.table.IMQMSG35。用于创建消息表的 SQL 命令。
- imq.persist.jdbc.table.IMQPROPS35。用于创建属性表的 SQL 命令。
- imq.persist.jdbc.table.IMQILIST35。用于创建 Interest 状态表的 SQL 命令。
- imq.persist.jdbc.table.IMQTXN35。用于创建事务表的 SQL 命令。
- imq.persist.jdbc.table.IMQTACK35。用于创建事务确认表的 SQL 命令。
有关这些属性的完整参考信息,请参见第 14 章“代理属性参考”。
数据库管理器实用程序 (imqdbmgr)
Message Queue 为设置持久性所需的模式提供了数据库管理器实用程序(imqdbmgr)。如果 Message Queue 数据库表被损坏或者您希望使用不同的数据库作为数据存储库,也可以使用该实用程序删除此数据库表。
有关 imqdbmgr 命令的语法、子命令和选项的参考信息,请参见第 13 章“命令参考”。
确保持久性数据的安全持久存储可以包含与其他信息一起临时存储的消息文件。由于这些消息可能包含专用信息,所以保护数据存储库以防止未授权的访问至关重要。本节介绍如何保护内置文件存储或 JDBC 存储中的数据。
内置(基于文件的)持久性存储
使用内置持久性的代理将持久性数据写入文本文件数据存储库,其位置因操作系统而异(请参见附录 A“Message Queue 数据在特定操作系统中的位置”):
…/instances/instanceName/fs350/
其中,instanceName 为标识代理实例的名称。
第一次启动代理实例时,将创建 instanceName/filestore/ 目录。保护此目录的过程取决于运行代理的操作系统。
Solaris 和 Linux IMQ_VARHOME/instances/instanceName/filestore/ 目录的访问权限取决于启动代理实例的用户的 umask。因此,可以通过适当设置 umask 来限制获取启动代理实例并读取其持久性文件的权限。或者,管理员(超级用户)可以通过将 IMQ_VARHOME/instances 目录上的权限设为 700 来保护持久性数据。
Windows 可以通过您使用的 Windows 操作系统提供的机制来设置 IMQ_VARHOME/instances/instanceName/filestore/ 目录的访问权限。这通常涉及打开目录的属性对话框。
插入的 (JDBC) 持久性存储
使用插入的持久性的代理向 JDBC 兼容数据库写入持久性数据。
对于由数据库服务器管理的数据库(例如,Oracle 数据库),建议创建一个用户名和密码来访问 Message Queue 数据库表(名称以“IMQ”开头的表)。如果数据库不允许保护单个表,请创建一个仅由 Message Queue 代理使用的专用数据库。请参见数据库供应商提供的文档,以了解如何创建用户名/密码访问。
代理打开数据库连接所需的用户名和密码可以作为代理配置属性提供。但是,启动代理时将它们作为命令行选项更为安全(请参见 Message Queue 管理指南的附录 A“设置插入的持久性”)。
对于代理通过数据库的 JDBC 驱动程序直接访问的嵌入式数据库,通常通过在要存储持久性数据的目录上设置文件权限来提供安全性,如内置(基于文件的)持久性存储中所述。但是,为确保代理和 imqdbmgr 实用程序均可读写数据库,两者应由同一用户运行。