代理配置由一组配置文件以及在启动时传递给 imqbrokerd 命令的选项控制。本章介绍了可用的配置属性以及如何使用它们来配置代理。
本章包含以下各节:
有关代理配置属性的完整参考信息,请参见第 14 章,代理属性参考。
代理配置属性可以分为几种类别,具体取决于它们所影响的服务或代理组件:
以下各节介绍了上述每个服务,并介绍了可用于根据特定需要自定义这些服务的属性。
消息代理可以提供各种连接服务,这些连接服务使用各种传输协议来支持应用程序客户端和管理客户端。 连接属性中列出了与连接服务相关的代理配置属性。
表 4–1 显示了可用的连接服务,这些服务可以通过以下两个特性进行区分:
表 4–1 Message Queue 连接服务
服务名称 |
服务类型 | |
---|---|---|
NORMAL | ||
NORMAL | ||
NORMAL | ||
NORMAL | ||
ADMIN |
TCP |
|
ADMIN |
TLS(基于 SSL 的安全性) |
通过设置代理的 imq.service.activelist 属性,可以将其配置为运行上述任意或全部连接服务。此属性的值是一个连接服务列表,当代理启动时,会激活该列表中的连接服务;如果未明确指定此属性,则默认情况下将激活 jms 和 admin 服务。
每个连接服务还支持特定的验证和授权功能;有关详细信息,请参见安全服务。
每个连接服务仅在由主机名(或 IP 地址)和端口号指定的特定端口上可用。 您可以明确地为服务指定静态端口号,也可以让代理的端口映射器动态指定端口号。端口映射器自身驻留在代理的主端口上,该端口通常位于标准端口号 7676 上。(如果需要,您可以通过代理配置属性 imq.portmapper.port,用其他端口号来覆盖标准端口号。) 默认情况下,每个连接服务在启动时都在端口映射器中注册自身。当客户端创建与代理的连接时,Message Queue 客户端运行时环境首先与端口映射器联系,为所需的连接服务请求端口号。
或者,也可以使用 imq.serviceName.protocolType. port 配置属性(其中 serviceName 和 protocolType 标识特定的连接服务, 如表 4–1 中所示)来覆盖端口映射器的设置,并明确地为连接服务指定一个静态端口号。(只有 jms、 ssljms、admin 和 ssladmin 连接服务可以通过这种方式进行配置;httpjms 和 httpsjms 服务使用不同的配置属性,如附录 C,HTTP/HTTPS 支持 中所述。)但是,静态端口通常仅在特殊情况下(例如要穿过防火墙建立连接)使用(请参见通过防火墙连接),建议不要在一般情况下使用静态端口。
如果有两个或更多的主机可用(例如,在一台计算机中安装了多个网卡),则可以使用代理属性来指定连接服务应该绑定到哪个主机。 imq.hostname 属性为所有连接服务指定一个默认主机;如果需要,以后可以使用 imq.serviceName. protocolType.hostname (对于 jms、 ssljms、admin 或 ssladmin 服务)或imq.portmapper.hostname(对于端口映射器自身)来覆盖此默认值。
如果同时收到多个端口映射器请求,则它们将存储在操作系统后备队列 (backlog) 中等待操作。 imq.portmapper.backlog 属性指定后备队列中的请求的最大数量。 如果超过此限制,随后的任何请求都将被拒绝,直到后备队列中的请求减少。
每个连接服务都是多线程的,因此可以支持多个连接。这些连接所需的线程由代理在每个服务的单独线程池中维护。当连接需要某些线程时,这些线程即添加到支持该连接的服务的线程池中。
您选择的线程模型指定了线程是专用于单个连接还是由多个连接共享:
在专用模型中,与代理的每个连接都需要两个线程:一个用于传入消息,另一个用于传出消息。这限制了可以支持的连接数,但却提高了性能。
在共享模型中,当发送或接收消息时,连接由共享线程处理。 由于每个连接都不需要专用线程,因此这种模型增加了可能的连接数,但却降低了性能,因为线程管理需要额外的开销。
代理的 imq.serviceName. threadpool_model 属性指定了为给定连接服务使用两个模型中的哪一个。此属性接受两个字符串值中的一个:dedicated 或 shared。如果未明确设置此属性,则默认情况下采用 dedicated。
还可以通过设置代理属性 imq.serviceName. min_threads 和 imq.serviceName. max_threads 来指定服务线程池中的最小线程数和最大线程数。 当可用线程数超过指定的最小阈值时, Message Queue 将在线程变为空闲状态时将其关闭,直到再次达到最小阈值,以此来节省内存资源。 如果负载较重,线程数可能会增加,直到达到线程池的最大数量;此后,新的连接将被拒绝,直到某个线程变得可用。
共享线程模型使用分配器线程为活动连接指定线程。 代理属性 imq.shared.connectionMonitor_limit 指定单个分配器线程可以监视的最大连接数。 此属性的值越小,为连接指定线程的速度越快。imq.ping.interval 属性指定代理定期测试 ("ping") 连接(以验证该连接是否仍然处于活动状态)的时间间隔(以秒为单位)。通过这种定期测试,可以尽早检测出连接故障,以免在尝试传输消息时失败。
客户端连接到代理之后,即可开始路由和传送消息。 在这个阶段,代理负责创建和管理不同类型的物理目的地,确保消息流畅通,以及有效地使用资源。您可以使用路由属性中介绍的代理配置属性,根据应用程序的需要以相应方式来管理这些任务。
代理的性能和稳定性取决于可用的系统资源(如内存)以及资源的使用效率。 可以设置配置属性,以防止代理因传入消息太多而过载,或者耗尽内存。这些属性在三种不同的级别上起作用,使消息服务在资源不足时仍可正常运行:
系统范围的消息限制共同应用于系统中的所有物理目的地。 这些限制包括代理保存的最大消息数 (imq.system.max_count) 以及这些消息占用的最大总字节数 (imq.system.max_size)。如果达到这两个限制中的任何一个,代理将会拒绝所有新消息,直到待处理消息低于该限制。 在单个消息的最大大小 (imq.message.max_size) 以及回收过期消息的时间间隔 (imq.message.expiration.interval) 方面也存在限制。
单个目的地限制控制发送到特定物理目的地的消息流。 第 15 章,物理目的地属性参考中对控制这些限制的配置属性进行了介绍。其中包括以下几个方面的限制:目的地可以保存的消息的数量和大小、可以为目的地创建的消息生成方和使用方的数量,以及可以作为一个批次一起传送到目的地的消息数。
可以对目的地进行配置以响应内存限制:降低消息生成方传送消息的速度、拒绝新的传入消息,或者丢弃时间最长或优先级最低的现有消息。 对于以这种方式从目的地中删除的消息,可以选择将其移动到停用消息队列,而不是彻底丢弃;代理属性 imq.destination.DMQ.truncateBody 可以控制是将整个消息主体保存在停用消息队列中,还是仅仅将消息头和属性数据保存在停用消息队列中。
为了在应用程序开发和测试期间提供方便,可以将消息代理配置为:只要消息生成方或使用方尝试访问的目的地不存在,即自动创建新的物理目的地。 表 14–3 中汇总的代理属性与上面介绍的代理属性类似,但它们适用于这种自动创建的目的地,而不是以管理方式创建的目的地。
系统内存阈值定义了几个内存使用级别,代理将根据这些级别采取越来越严格的措施以防止内存过载。 共定义了四个这样的使用级别:
Green:有大量内存可用。
Yellow:代理内存开始变得不足。
Orange:代理内存非常少。
Red:代理已没有可用内存。
定义这些级别的内存占用百分比分别由代理属性 imq.green.threshold、 imq.yellow.threshold、imq.orange.threshold 和 imq.red.threshold 指定;默认值为 0% (green)、80% (yellow)、90% (orange) 和 98% (red)。
当内存使用从一个级别上升到另一个级别时,代理将采取渐进的响应措施:首先将消息从活动内存交换到持久性存储库中,然后限制非持久性消息的生成方,最后阻止消息流入代理。 (这两种措施都会降低代理的性能。)代理使用以下方法来限制消息生成:将传送的每个批次的大小限制为由属性 imq.resourceState .count 所指定的消息数,其中 resourceState 分别为 green 、yellow、orange 或 red 。
触发这些系统内存阈值表明系统范围和目的地级别的消息限制设置得过高。由于内存阈值无法始终及时地捕获潜在的内存过载,因此不应该依赖它们来控制内存使用,而应重新配置系统范围和目的地级别的限制以优化内存资源。
代理在发生故障后进行恢复时,需要重新创建消息传送操作的状态。 要执行此操作,代理必须将状态信息保存到持久性数据存储库中。代理在重新启动后,将使用保存的数据重新创建目的地和长期订阅,恢复持久性消息,回滚打开的事务,并为未传送的消息重新生成路由表。 然后它才能恢复消息传送。
Message Queue 既支持基于文件的持久性模块,也支持基于 JDBC 的持久性模块(请参见图 4–1)。基于文件的持久性存储使用单个文件来存储持久性数据;基于 JDBC 的持久性存储使用 Java 数据库连接 (Java Database Connectivity, JDBC™) 接口将代理连接到符合 JDBC 的数据存储库。虽然基于文件的持久性存储通常比基于 JDBC 的持久性存储快,但某些用户更希望使用 JDBC 存储库所提供的冗余和管理控制功能。代理配置属性 imq.persist.store(请参见表 14–4)指定使用两种持久性形式中的哪一种。
默认情况下,Message Queue 使用基于文件的持久性数据存储库,在这种存储库中使用单个文件来存储持久性数据,如消息、目的地、长期订阅和事务。 基于文件的持久性中列出了与基于文件的持久性相关的代理配置属性。
基于文件的存储库位于某个目录中,该目录使用数据存储库所属的代理实例的名称 (instanceName) 进行标识:
…/instances/instanceName /fs350/
(有关 instances 目录的位置,请参见附录 A, Message QueueTM 数据在特定平台上的位置。)代理中的每个目的地都有其自身的子目录,用于保存传送到该目的地的消息。
由于持久性数据存储库可能会包含敏感或专用的消息,因此应该保护 …/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 属性为 true,则在代理关闭时将清空池中的所有文件,使其保持清除状态;这样可以节省存储器空间,但会减慢关闭过程。
将数据写入持久性存储库时,操作系统在以同步还是“延迟”(异步)方式写入数据方面存在一定的不准确性。 延迟存储可能会导致数据在系统崩溃时丢失(如果代理认为数据已经写入持久性存储库,但实际并未写入)。为了确保绝对的可靠性(以牺牲性能为代价),可以将代理属性 imq.persist.file.sync.enabled 设置为 true,以要求同步写入所有数据。 在这种情况下,当系统在崩溃后恢复运行时,可以保证数据是可用的,并且代理可以可靠地恢复运行。但请注意,虽然数据并未丢失,但却不能用于群集中的任何其他代理,因为群集中的代理当前并未共享该数据。
可以不使用基于文件的持久性,而将代理设置为访问可通过 JDBC 驱动程序进行访问的任何数据存储库。 这需要设置适当的与 JDBC 相关的代理配置属性,以及使用数据库管理器实用程序 (imqdbmgr) 创建具有正确结构的数据库。有关详细信息,请参见配置基于 JDBC 的存储库。
基于 JDBC 的持久性中列出了用于将代理配置为使用 JDBC 数据库的属性。可以在每个代理实例的实例配置文件 (config.properties ) 中指定这些属性,也可以使用代理实用程序 (imqbrokerd) 或数据库管理器实用程序 (imqdbmgr) 的 -D 命令行选项来指定这些属性。
imq.persist.jdbc.driver 属性提供了连接到数据库时使用的 JDBC 驱动程序的 Java 类名。 还有一些属性用于指定具有以下功能的 URL:连接到现有数据库 (imq.persist.jdbc.opendburl)、创建新的数据库 (imq.persist.jdbc.createdburl) 和关闭数据库连接 (imq.persist.jdbc.closedburl)。
imq.persist.jdbc.user 和 imq.persist.jdbc.password 属性提供了用于访问数据库的用户名和密码;imq.persist.jdbc.needpassword 是用于指定是否需要密码的布尔标志。 为了安全起见,应该仅在通过 -passfile 命令行选项指定的密码文件中指定密码;如果未指定此类密码文件,则 imqbrokerd 和 imqdbmgr 命令将以交互方式提示您指定密码。 同样,可以通过在命令行中使用 imqbrokerd 命令的 -dbuser 选项或 imqdbmgr 命令的 -u 选项来提供用户名。
在由多个代理实例共享的 JDBC 数据库中,配置属性 imq.persist.jdbc.brokerid 指定每个实例的唯一实例标识符,该标识符将被附加到数据库表名的后面。 (嵌入式数据库只存储一个代理实例的数据,因此通常不需要此属性。)与 JDBC 相关的其余配置属性用于自定义创建数据库结构的 SQL 代码,每个数据库表对应一个属性。 例如,imq.persist.jdbc.table.IMQSV35 属性提供用于创建版本表的 SQL 命令,imq.persist.jdbc.table.IMQCCREC35 属性提供用于创建配置更改记录表的 SQL 命令,imq.persist.jdbc.table.IMQDEST35 属性则提供用于创建目的地表的 SQL 命令,等等;有关完整列表,请参见表 14–6。
由于各个数据库系统所要求的具体 SQL 语法不同,因此请务必查看数据库供应商提供的相应文档以了解详细信息。
Message Queue 为用户访问控制(验证和授权)和加密提供了安全服务。
Message Queue 管理员负责设置代理在验证用户以及为用户授予操作权限时所需的信息。 安全属性中列出了与安全服务有关的代理属性。 布尔属性 imq.accesscontrol.enabled 充当一个主开关,用于控制是否在代理范围内应用访问控制;要进行更精细的控制,可以通过设置 imq.serviceName .accesscontrol.enabled 属性(其中,serviceName 是连接服务的名称,如表 4–1 所示)来覆盖特定连接服务的此设置:例如,imq.httpjms.accesscontrol.enabled。
图 4–2 显示了代理在提供验证和授权服务时所需的组件。 这些服务依赖于用户系统信息库,该系统信息库包含有关消息传送系统用户的以下信息: 用户名、密码和组成员资格。此外,为了给用户或组授予执行特定操作的权限,代理还会查询访问控制属性文件,该文件指定了用户或组可以执行的操作。可以使用配置属性 imq.accesscontrol.file.filename 为整个代理指定一个访问控制属性文件,也可以使用 imq.serviceName. accesscontrol.file.filename 为单个连接服务指定访问控制属性文件。
如图 4–2 所示,您可以将用户数据存储在随 Message Queue 服务一起提供的平面文件用户系统信息库中,也可以将它们插入原有的轻量目录访问协议 (Lightweight Directory Access Protocol, LDAP) 系统信息库中:
如果选择平面文件系统信息库,则必须使用 Message Queue 用户管理器实用程序 (imqusermgr) 来管理系统信息库。此选项是内置的,非常易于使用。
如果您希望使用现有的 LDAP 服务器,请使用 LDAP 供应商提供的工具来填充和管理用户系统信息库。 您还必须在代理的实例配置文件中设置一些属性,以使代理能够在 LDAP 服务器中查询有关用户和组的信息。
代理的 imq.authentication.basic.user_repository 属性指定要使用的系统信息库的类型。通常,如果可伸缩性很重要,或者您需要让不同的代理共享系统信息库(例如,如果您使用的是代理群集),则最好使用 LDAP 系统信息库。有关设置平面文件或 LDAP 用户系统信息库的详细信息,请参见用户验证。
请求与代理建立连接的客户端必须提供用户名和密码,代理会将该用户名和密码与存储在用户系统信息库中的用户名和密码进行比较。从客户端传输到代理的密码是使用 Base-64 编码(对于平面文件系统信息库)或消息摘要 (MD5) 散列(对于 LDAP 系统信息库)进行编码的。 具体提供哪一种编码由 imq.authentication.type 属性(对于整个代理)或 imq.serviceName. authentication.type 属性(对于特定连接服务)控制。imq.authentication.client.response.timeout 属性设置验证请求的超时时间间隔。
如密码文件中所述,您可以选择将密码放在密码文件中,而不是让系统以交互方式提示您指定密码。 此选项由布尔型代理属性 imq.passfile.enabled 控制。如果此属性为 true,则 imq.passfile.dirpath 和 imq.passfile.name 属性提供密码文件的目录路径和文件名。 imq.imqcmd.password 属性(可以嵌入密码文件中)指定密码,该密码用于验证管理用户是否有权使用命令实用程序 (imqcmd) 来管理代理、连接服务、连接、物理目的地、长期订阅和事务。
如果您使用的是基于 LDAP 的用户系统信息库,则可以使用所有代理属性来配置 LDAP 查找的各个方面。LDAP 服务器自身的地址(主机名和端口号)由 imq.user_repository.ldap.server 指定。imq.user_repository.ldap.principal 属性提供用于绑定到 LDAP 系统信息库的标识名,而 imq.user_repository.ldap.password 则提供关联的密码。其他属性为单个的用户和组搜索指定目录库和可选 JNDI 过滤器,为用户和组名指定特定于提供者的属性标识符,等等;有关详细信息,请参见安全属性。
用户通过验证后,即可被授权执行与 Message Queue 相关的各种活动。 Message Queue 管理员可以定义用户组,并指定组中各个用户的成员资格。 默认的访问控制属性文件只明确地引用一个组,即 admin(请参见 组)。此组中的用户具有 admin 连接服务的连接权限, 该权限允许用户执行诸如创建目的地以及监视和控制代理等管理功能。 默认情况下,您定义的任何其他组中的用户都无法获取 admin 服务连接。
当用户尝试执行某个操作时,代理将对照访问控制属性文件中指定的允许执行该操作的用户名和组成员资格,来检查用户系统信息库中该用户的用户名和组成员资格。 访问控制属性文件为用户或组指定了执行以下操作的权限:
要对客户端与代理之间发送的消息进行加密,需要使用基于安全套接字层 (Secure Socket Layer, SSL) 标准的连接服务。 SSL 通过在启用 SSL 的代理与客户端之间建立加密连接来提供连接级别的安全性。
要使用基于 SSL 的 Message Queue 连接服务,需要使用密钥工具实用程序 (imqkeytool) 生成公钥/私钥对。此实用程序将公钥嵌入自签名的证书中,然后将此证书放入 Message Queue 密钥库中。 密钥库自身受密码保护;要解除对密钥库的锁定,必须在启动时提供由 imq.keystore.password 属性指定的密钥库密码。 解除对密钥库的锁定后,代理即可将证书传递给请求连接的任何客户端。然后,客户端可以使用此证书建立与代理的加密连接。
imq.audit.enabled 代理属性控制将审计记录记录到 Message Queue 代理日志文件的行为;有关详细信息,请参见审计日志记录。
代理中包含一些用于监视和诊断应用程序及代理性能的组件。其中包括:
生成数据的组件,包括度量生成器和记录事件的代理代码
将输出信息写入多个输出通道的记录程序组件
度量消息生成方,将包含度量信息的 JMS 消息发送到主题目的地,以供 JMS 监视客户端使用
图 4–3 中显示的是常规模式。 监视属性中列出了用于配置监视服务的代理属性。
度量生成器提供有关代理活动的信息,如流入流出代理的消息、代理内存中的消息数及其使用的内存量、打开的连接数以及正在使用的线程数。 布尔型代理属性 imq.metrics.enabled 控制是否记录此类信息;imq.metrics.interval 指定记录的频率。
出错时,记录程序获取代理代码和度量生成器生成的信息,并将这些信息写入标准输出(控制台)、日志文件以及 syslog 守护进程(在 Solaris 平台上)中。要使用的日志文件由 imq.log.file.dirpath 和 imq.log.file.filename 代理属性标识; imq.log.console.stream 指定将控制台输出定向到 stdout 还是 stderr。
imq.log.level 属性控制记录程序收集的度量信息的类别: ERROR、WARNING 或 INFO。每个级别都包括高于它的级别,因此,如果您指定 WARNING 作为日志记录级别,则将同时记录错误消息。imq.log.console.output 和 imq.log.file.output 属性分别控制将哪些指定类别写入控制台和日志文件。 但在这种情况下,类别并不包括高于它的类别;因此,如果您要将错误和警告写入日志文件,而将信息性消息写入控制台,则必须明确地将 imq.log.file.output 设置为 ERROR|WARNING,将 imq.log.console.output 设置为 INFO。在 Solaris 平台上,使用另一个属性 imq.log.syslog.output 来指定要写入 syslog 守护进程的度量信息的类别。 此外还有一个 imq.destination.logDeadMsgs 属性,该属性指定当停用消息被丢弃或移动到停用消息队列时是否进行记录。
对于日志文件,可以指定何时关闭文件并将输出转移到新文件。 当日志文件达到指定的大小 (imq.log.file.rolloverbytes) 或生存期 (imq.log.file.rolloversecs) 之后,将保存该文件并创建一个新的日志文件。
有关与日志记录相关的其他代理属性,请参见监视属性;有关如何配置记录程序以及如何使用它来获取性能信息的更多详细信息,请参见配置和使用代理日志记录。
度量消息生成方以一定的时间间隔从度量生成器接收信息,并将该信息写入度量消息,然后根据消息中包含的度量信息类型,将度量消息发送到多个度量主题目的地之一(请参见表 4–2)。订阅这些度量主题目的地的 Message Queue 客户端可以使用这些消息并处理消息中包含的度量数据。 这样,开发者就可以创建自定义监视工具来支持消息传送应用程序。有关在每种类型的度量消息中报告的度量数量的详细信息,请参见 Message Queue Developer's Guide for Java Clients。
表 4–2 度量主题目的地
主题名称 | |
---|---|
mq.metrics.broker |
代理度量 |
mq.metrics.jvm |
Java 虚拟机度量 |
mq.metrics.destination_list |
目的地及其类型的列表 |
mq.metrics.destination.queue.queueName |
指定队列的目的地度量 |
mq.metrics.destination.topic.topicName |
指定主题的目的地度量 |
代理属性 imq.metrics.topic.enabled 和 imq.metrics.topic.interval 分别控制是否将消息发送到度量主题目的地以及发送的频率。 imq.metrics.topic.timetolive 和 imq.metrics.topic.persist 属性分别指定此类消息的生命周期和持久性。
除了包含在度量消息主体中的信息之外,每个消息头中还包含提供以下附加信息的属性:
消息类型
发送消息的代理的地址(主机名和端口号)
度量样例的取样时间
这些属性对于处理不同类型(或来自不同代理)度量消息的客户端应用程序非常有用。
可以通过以下两种方式之一来指定代理的配置属性:
编辑代理的配置文件
直接从命令行提供属性值
以下两节介绍了这两种配置代理的方法。
代理配置文件包含用于配置代理的属性设置。 这些文件保存在一个目录中,该目录的位置取决于使用的操作系统平台;有关详细信息,请参见附录 A, Message QueueTM 数据在特定平台上的位置。该目录存储以下文件:
启动时加载的默认配置文件 default.properties。此文件不可编辑,但您可以通过读取该文件来确定默认设置,以及查找要更改的属性的确切名称。
包含安装 Message Queue 时指定的全部属性的安装配置文件 install.properties。此文件在安装后无法进行编辑。
此外,每个单独的代理实例都有其自身的实例配置文件,如下所述。如果连接群集中的代理实例,您可能还需要使用群集配置文件来指定群集的配置信息;有关详细信息,请参见群集配置属性。
启动时,代理会合并各个配置文件中的属性值。 如图 4–4 中所示,这些文件构成了一个分层结构,在此结构中,实例配置文件中指定的值将覆盖安装配置文件中的值,而安装配置文件中的值又将覆盖默认配置文件中的值。 在分层结构的顶部,您可以通过使用 imqbrokerd 命令的命令行选项来手动覆盖配置文件中指定的任何属性值。
首次运行代理时,将创建一个实例配置文件,其中包含该特定代理实例的配置属性。该实例配置文件被命名为 config.properties,并存储在由所属代理实例的名称标识的目录中:
…/instances/ instanceName/props/config.properties
(有关 instances 目录的位置,请参见附录 A, Message QueueTM 数据在特定平台上的位置。)如果该文件不存在,则必须在启动代理时使用 -name 选项(请参见代理实用程序)指定一个实例名, Message Queue 可以使用该实例名来创建文件。
instances/instanceName 目录和实例配置文件由创建相应代理实例的用户所有。 代理实例必须始终由该用户重新启动。
实例配置文件由代理实例维护,并在您使用 Message Queue 管理实用程序更改配置时进行相应的更改。 您也可以手动编辑实例配置文件,以便自定义代理的行为和资源使用。 要执行此操作,您必须是 instances/instanceName 目录的拥有者,或者以 root 身份登录,以更改目录的访问权限。
代理仅在启动时读取实例配置文件。要对代理配置进行永久性更改,您必须关闭代理,编辑该文件,然后重新启动代理。 该文件(或任何配置文件)中的属性定义使用以下语法:
propertyName=value [[,value1] …]
例如,下面的条目指定,代理最多可以在内存和持久性存储库中保存 50, 000 条消息,超过此限制后,将拒绝其他消息:
imq.system.max_count=50000
下面的条目指定,将每天(86, 400 秒)创建一个新的日志文件:
imq.log.file.rolloversecs=86400
有关可用代理配置属性及其默认值的信息,请参见代理服务和第 14 章,代理属性参考。
在启动代理时(或之后),可以在命令行中输入代理配置选项。
在启动时,可使用代理实用程序 (imqbrokerd) 启动代理实例。 通过使用该命令的 -D 选项,可以指定任何代理配置属性及其值;有关详细信息,请参见启动代理和代理实用程序。如果使用服务管理器实用程序 ( imqsvcadmin) 将代理作为 Windows 服务启动,则可使用 -args 选项指定启动配置属性;请参见服务管理器实用程序。
在代理实例运行时,还可以更改某些代理属性。 要修改正在运行的代理的配置,请使用命令实用程序的 imqcmd update bkr 命令;请参见更新代理属性和代理管理。
代理的持久性数据存储库保存有关物理目的地、长期订阅、消息、事务和确认的信息。默认情况下,Message Queue 代理被配置为使用基于文件的持久性存储库,但您可以将其重新配置为插入可通过 JDBC 驱动程序访问的任何数据存储库。代理配置属性 imq.persist.store(见表 14–4)指定使用两种持久性形式中的哪一种。
本节介绍了如何设置代理以使用持久性存储库。包括以下主题:
在创建代理实例时,将自动创建基于文件的数据存储库。存储库位于代理的实例目录中;有关确切位置,请参见附录 A, Message QueueTM 数据在特定平台上的位置。
默认情况下,Message Queue 执行异步的磁盘写入操作。操作系统可以缓冲这些操作以获取高性能。但是,如果在两次写入操作之间出现意外的系统故障,则消息可能会丢失。为了提高可靠性(但会降低性能),可以设置代理属性 imq.persist.file.sync 以改为同步写入数据。 有关此属性的进一步论述,请参见基于文件的持久性和表 14–5。
启动代理实例时,可以使用 imqbrokerd 命令的 -reset 选项清除文件系统存储库。 有关此选项及其子选项的详细信息,请参见代理实用程序。
要配置代理以使用基于 JDBC 的持久性,请在代理的实例配置文件中设置与 JDBC 相关的属性,并创建相应的数据库结构。 Message Queue 数据库管理器实用程序 ( imqdbmgr) 使用 JDBC 驱动程序和代理配置属性来创建和管理数据库。如果数据库表已经损坏或者您希望使用其他的数据库作为数据存储库,则还可以使用数据库管理器从数据库中删除损坏的表或删除数据库。 有关详细信息,请参见数据库管理器实用程序。
系统提供了 Oracle 和 PointBase 数据库产品的示例配置。这些文件的位置因平台而异,在附录 A, Message QueueTM 数据在特定平台上的位置 中相关表的“示例应用程序和配置”下列出了此位置。此外,在实例配置文件 config.properties 中以注释值的形式提供了 PointBase 嵌入式版本、PointBase 服务器版本和 Oracle 的示例。
在代理的配置文件中设置与 JDBC 相关的属性。
基于 JDBC 的持久性中讨论了这些相关属性,并在表 14–6 中列出了这些属性。需要特别指出的是,您必须将代理的 imq.persist.store 属性设置为 jdbc(请参见持久性属性)。
将 JDBC 驱动程序的 .jar 文件的副本或符号链接放入以下位置:
在 Solaris 上:
/usr/share/lib/imq/ext/ |
在 Linux 上:
/opt/sun/mq/share/lib/ |
在 Windows 上:
IMQ_VARHOME\\lib\\ext |
例如,如果您在 Solaris 系统上使用 PointBase,则以下命令将驱动程序的 .jar 文件复制到相应位置:
% cp j2eeSDKInstallDirectory/pointbase/lib/pointbase.jar /usr/share/lib/imq/ext |
以下命令则创建一个符号链接:
% ln -s j2eeSDKID/lib/pointbase/pointbase.jar /usr/share/lib/imq/ext |
创建 Message Queue 持久性所需的数据库结构。
使用 imqdbmgr create all 命令(对于嵌入式数据库)或 imqdbmgr create tbl 命令(对于外部数据库);请参见数据库管理器实用程序。
转到 imqdbmgr 所在的目录:
在 Solaris 上:
cd /usr/bin |
在 Linux 上:
cd /opt/sun/mq/bin |
在 Windows 上:
cd IMQ_HOME\\bin |
输入 imqdbmgr 命令:
imqdbmgr create all
如果使用嵌入式数据库,则最好在以下目录中创建它:
… /instances/ instanceName/dbstore/ databaseName
如果嵌入式数据库未设置用户名和密码保护,则可能设置了文件系统权限保护。要确保代理能够对数据库进行读写访问,则运行该代理的用户应该是使用 imqdbmgr 命令创建该嵌入式数据库的用户。
持久性存储库可以包含临时存储的消息文件以及其他信息。 由于这些消息可能包含专用信息,因此保护数据存储库以防止未经授权的访问非常重要。本节介绍了如何保护基于文件或基于 JDBC 的数据存储库中的数据。
使用基于文件持久性的代理将持久性数据写入平面文件数据存储库,该数据存储库的位置因平台而异(请参见附录 A, Message QueueTM 数据在特定平台上的位置):
…/instances/ instanceName/fs350/
其中 instanceName 是标识代理实例的名称。
instanceName/fs350/ 目录是在第一次启动代理实例时创建的。保护此目录的过程取决于运行代理的操作系统平台:
在 Solaris 和 Linux 上,目录的权限由启动代理实例的用户的文件模式创建掩码 (umask) 确定。因此,可以通过适当地设置掩码来限制启动代理实例及读取其持久性文件的权限。或者,管理员(超级用户)也可以通过将 instances 目录的权限设置为 700 来保护持久性数据。
在 Windows 上,可以使用 Windows 操作系统提供的机制来设置目录的权限。 这通常涉及打开目录的“属性”对话框。
使用基于 JDBC 持久性的代理将持久性数据写入符合 JDBC 的数据库。对于由数据库服务器管理的数据库(如 Oracle), 建议创建一个用户名和密码来访问 Message Queue 数据库表(名称以 IMQ 开头的表)。如果数据库不允许保护单个表,请创建一个仅由 Message Queue 代理使用的专用数据库。请参见数据库供应商提供的文档,以了解有关如何创建用户名/密码访问的信息。
代理打开数据库连接所需的用户名和密码可以作为代理配置属性来提供。但是,一种更安全的方法是在启动代理时将它们作为命令行选项(使用 imqbrokerd 命令的 -dbuser 和 -dbpassword 选项)提供(请参见代理实用程序)。
对于代理通过数据库 JDBC 驱动程序直接访问的嵌入式数据库,通常通过在要存储持久性数据的目录上设置文件权限来提供安全性,如前面的保护基于文件的存储库中所述。但是,要确保代理和数据库管理器实用程序均可读写数据库,二者应该由同一个用户来运行。