代理的持久性数据存储库保存有关物理目的地、长期订阅、消息、事务和确认的信息。默认情况下,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 驱动程序直接访问的嵌入式数据库,通常通过在要存储持久性数据的目录上设置文件权限来提供安全性,如前面的保护基于文件的存储库中所述。但是,要确保代理和数据库管理器实用程序均可读写数据库,二者应该由同一个用户来运行。