8.12. jakarta Enterprise Beans-clustered 数据库计时器

JBoss EAP 支持群集数据库支持定时器,用于在群集环境中持久保留 Jakarta Enterprise Beans 计时器。因为集群是通过数据库提供的,如果计时器在较短的时间内停机的数量增加,则性能会降低。您可以使用 ejb3/service=timer -service/database -data-store 组件的 refresh-interval 和 allow- execution 属性来优化性能。

您还可以在非集群模式下使用数据库计时器,如下所示:

  • refresh-interval 设置为 0
  • 为每个节点提供唯一的分区名称,或者对每个节点使用不同的数据库。

Jakarta Enterprise Beans-clustered 数据库计时器如下:

  • 允许执行计时器的每个节点都会为每个计时器调度一个超时时间。
  • 当这个超时过期时,每个节点都会尝试通过将其状态更新为 running 来锁定计时器。

    更新其状态的查询类似以下查询:

    UPDATE JBOSS_EJB_TIMER SET TIMER_STATE=? WHERE ID=? AND TIMER_STATE<>? AND NEXT_DATE=?;

由于使用了事务处理和 READ_COMMITTED 或 SERIALIZABLE 隔离模式,只有一个节点成功更新该行,这是计时器执行的节点。

8.12.1. 设置 Jakarta Enterpise Beans-clustered 计时器

您可以通过添加数据库支持的计时器存储来设置 Jakarta Enterprise Beans-clustered 计时器。

先决条件

  • 数据库必须支持 READ_COMMITTED 或 SERIALIZABLE 隔离模式。

流程

  • 创建数据库支持的计时器存储:

    /subsystem=ejb3/service=timer-service/database-data-store=my-clustered-store:add(allow-execution=true, datasource-jndi-name='java:/MyDatasource', refresh-interval=60000, database='postgresql', partition='mypartition')

    根据以下内容设置参数:

    • allow-execution : 设置为 true,以允许此节点执行计时器。如果将它设置为 false,JBoss EAP 会将此节点上的计时器添加到数据库,供另一个节点执行。当您将定时器执行限制为集群中几个节点时,可以减少总体数据库负载。
    • datasource-jndi-name :要使用的数据源。
    • refresh-interval :在此节点检查数据库是否由其他节点添加的新计时器前,设置必须调整的时间间隔。该值以毫秒为单位。

      重要

      设置较小的值意味着 JBoss EAP 加快使用定时器,但会增加数据库的负载。如果添加计时器的节点因为失败或 allow-execution 为 false,则此计时器可能无法运行,直到节点刷新后为止。

    • Database :定义正在使用的数据库的类型。些 SQL 语句由数据库自定义。

      如果未定义此属性,服务器将尝试自动检测该类型。目前支持的类型有 postgresql、mysqla cle、db2hsqlh2

      SQL 存在于以下文件中:module /system/layers/base/org/jboss/as/ejb3/main/timers/timer-sql.properties

      您可以通过向此文件中添加新的数据库特定 SQL 语句来修改已执行的 SQL 或添加对新数据库的支持。

    • 分区 :将值设置为您希望此节点所属的分区的名称。只有同一分区的节点的计时器才对此节点可见。使用此属性将大型集群分成几个较小的集群,以提高性能。
注意

要将此数据库数据存储用于非集群计时器,请将 refresh-interval 设置为零,并确保每个节点都有唯一的分区名称,或者对每个节点使用不同的数据库。