10.3. 使用 JDBC 数据库的消息传递日志持久性

要使用 JDBC 将消息和绑定数据保存到数据库,而不是使用默认的基于文件的日志,您必须配置 JBoss EAP 7 消息传递。

为此,您必须首先在 datasource s 子系统中配置数据源元素,然后在 messaging - activemq 子系统中的 server 元素上定义 journal- datasource 属性来使用该数据源。存在 journal-datasource 属性通知 messaging 子系统将日志条目持久保存到数据库,而非基于文件的日志。messaging-activemq 子系统中的 server 资源上的 journal-database 属性定义用于与数据库通信的 SQL 情况。此属性使用数据源元数据自动配置。

当将消息永久保留到基于文件的日志时,较大的消息大小仅受磁盘大小的限制。但是,当持久保留消息到数据库时,较大的消息大小仅限于该数据库的 BLOB 数据类型的最大大小。

重要

JBoss EAP 7.4 目前仅支持 Oracle 12c 和 IBM DB2 Enterprise 数据库。

10.3.1. 配置数据库持久性存储的注意事项

为提高可靠性,JBoss EAP 通过连接池实现消息调用,该池提供一组可在多个应用之间共享的指定数据库的开放连接。这意味着,如果 JBoss EAP 丢弃连接,池中的另一个连接会替换该故障的连接以避免失败。

注意

以前的 JBoss EAP 版本只支持池中的一个连接。

当您在 datasources 子系统中配置数据库持久性存储或池时,请考虑以下点:

  • min-pool-size 属性的值设置为至少 4,使连接专用于以下每个用法:

    • 一个用于绑定
    • 用于消息日志
    • 一个用于租期锁定,如果使用高可用性(HA)
    • 如果使用 HA,则节点管理器共享状态一个
  • 根据执行分页或大型消息流操作的并发线程数量,设置 max-pool-size 属性的值。没有定义用于配置 max-pool-size 属性的规则,因为线程数量和连接数量之间的关系不是一对一的。

连接数取决于进程分页和大型消息操作的线程数量,以及 阻止-timeout-wait-millis 的属性块,用于定义等待连接所需时间。

在专用线程中发生新的大型消息或分页操作,需要连接。这些专用的线程会排队,直到连接就绪或获取连接超时的时间,这会导致失败。

您可以根据需求自定义池配置,并测试环境中配置的池。

10.3.2. 配置消息传递日志 JDBC 持久性存储

按照以下步骤将 JBoss EAP 7 消息传递配置为使用 JDBC 将消息并将数据绑定到数据库:

  1. 在 datasources 子系统中配置数据源,供 messaging-activemq 子系统使用。有关如何创建和配置数据源的信息,请参阅 JBoss EAP 配置指南中的 数据源 管理
  2. 配置 messaging-activemq 子系统,以使用新的数据源。

    /subsystem=messaging-activemq/server=default:write-attribute(name=journal-datasource,value="MessagingOracle12cDS")

    这会在服务器配置文件的 messaging-activemq 子系统中创建以下配置:

    <server name="default">
      <journal datasource="MessagingOracle12cDS"/>
      ...
    </server>

JBoss EAP 消息传递现在已配置为使用数据库存储消息传递数据。

10.3.3. 配置消息传递日志表名称

JBoss EAP 7 消息传递使用单独的 JDBC 表来存储绑定信息、消息、大消息和分页信息。这些表的名称可以使用 服务器 配置文件 messaging - activemq 子系统中的 journal -bindings-table、journal-jms - bindings-table、journal -messages -table 和 journal-page- store-table 属性来配置。

下表列出了表名称限制:

  • JBoss EAP 7 消息传递使用模式 TABLE_NAME + GENERATED_ ID 为分页表生成标识符,其中 GENERATED_ID 最多可包含 20 个字符。由于 Oracle Database 12c 中的最大表名称长度为 30 个字符,因此您必须将表名称限制为 10 个字符。否则,您可能会看到 error ORA-00972: 标识符太长,分页将无法工作。
  • 不遵循 Oracle Database 12c 的架构对象命名规则 的表名称必须使用双引号括起。带引号的标识符可以任何字符开头,并且可以包含任何字符和标点符号以及空格。但是,带引号和非引号的标识符不能包含双引号或空字符(\0)。务必要注意,带引号的标识符区分大小写。
  • 如果多个 JBoss EAP 服务器实例使用相同的数据库来持久保留消息和绑定数据,则表名称对于每个服务器实例都必须是唯一的。多个 JBoss EAP 服务器无法访问相同的表。

以下是管理 CLI 命令的示例,它使用带引号的标识符配置 journal-page-store-table 名称:

/subsystem=messaging-activemq/server=default:write-attribute(name=journal-page-store-table,value="\"PAGE_DATA\"")

这会在服务器配置文件的 messaging-activemq 子系统中创建以下配置:

<server name="default">
  <journal datasource="MessagingOracle12cDS" journal-page-store-table="&quot;PAGED_DATA&quot;"/>
  ...
</server>

10.3.4. 在受管域中配置消息传递日志

配置消息传递日志表名称 中所述,在使用 JDBC 持久消息并将数据绑定到数据库时,多个 JBoss EAP 服务器无法访问同一数据库表。在受管域中,服务器组中的所有 JBoss EAP 服务器实例共享同一配置文件配置,因此您必须使用表达式来配置消息传递日志名称或数据源。

如果所有服务器都配置为使用同一个数据库来存储消息传递数据,则表名称必须为每个服务器实例唯一。以下是管理 CLI 命令的示例,它通过使用名称中包含唯一节点标识符 的表达式为服务器组中的每个服务器创建唯一的 journal-page-store-table 表名称:

/subsystem=messaging-activemq/server=default:write-attribute(name=journal-page-store-table,value="${env.NODE_ID}_page_store")

如果每个服务器实例访问不同的数据库,您可以使用表达式来允许各服务器的消息传递配置连接到不同的数据源。以下管理 CLI 命令使用 connection-url 中的 DB_CONNECTION_URL 环境变量连接到不同的数据源:

data-source add --name=messaging-journal --jndi-name=java:jboss/datasources/messaging-journal --driver-name=oracle12c  --connection-url=${env.DB_CONNECTION_URL}

10.3.5. 配置消息传递日志网络超时

您可以配置 JDBC 连接将等待数据库回复请求的最长时间,以毫秒为单位。如果网络因任何原因停机或 JBoss EAP 消息传递和数据库之间的连接已关闭,这很有用。发生这种情况时,客户端会被阻止,直到超时发生为止。

您可以通过更新 journal-jdbc-network-timeout 属性来配置超时。默认值为 20000 毫秒,即 20 秒。

以下是管理 CLI 命令的示例,它将 journal-jdbc-network-timeout 属性值设置为 10000 毫秒,或 10 秒:

/subsystem=messaging-activemq/server=default:write-attribute(name=journal-jdbc-network-timeout,value=10000)

10.3.6. 为消息传递 JDBC Persistence 存储配置 HA

当代理配置了数据库存储类型时,JBoss EAP messaging-activemq 子系统将激活 JDBC HA 共享存储功能。然后,代理使用共享数据库表来确保实时和备份服务器通过共享 JDBC 日志存储协调操作。

您可以使用以下属性为 JDBC 持久存储配置 HA:

  • journal-node-manager-store-table : JDBC 数据库表的名称,以存储节点管理器。
  • journal-jdbc-lock-expiration : JDBC 锁定被视为有效的时间,而不保持其正常运行。以秒为单位指定这个属性值。默认值为 20 秒。
  • journal-jdbc-lock-renew-period :JDBC 锁定服务的保持活动期间。以秒为单位指定这个属性值。默认值为 2 秒。

根据服务器的 ha-policy 和 journal- datasource 属性的值,考虑这些默认值。

为了向后兼容,您还可以使用相应的 Artemis 特定的系统属性指定它们的值:

  • brokerconfig.storeConfiguration.nodeManagerStoreTableName
  • brokerconfig.storeConfiguration.jdbcLockExpirationMillis
  • brokerconfig.storeConfiguration.jdbcLockRenewPeriodMillis

配置后,这些 element 特定的系统属性的优先级高于对应的属性的默认值。