持久性 Enterprise JavaBeans 计时器的配置选项
持久性 EJB 计时器不需要启用 ejbPersistentTimer 功能部件和设置缺省数据源(它具有 DefaultDataSource 标识以指向数据库)以外的任何配置。可选配置设置可用于控制行为,例如,选择另一数据源、控制轮询数据库以查找持久性计时器任务的时间和频率,以及是否重试失败或回滚计时器任务及重试频率。
EJB 计时器配置是由可选 timerService 配置元素指定的。持久性 EJB 计时器的配置属性进一步组合到 persistentExecutor 配置下。缺省情况下,EJB 计时器服务使用名为 defaultEJBPersistentTimerExecutor 的持久性执行程序实例。可通过将计时器服务配置为使用另一持久性执行程序实例来定制 EJB 持久性计时器配置。但是,定制 EJB 持久性计时器配置的最佳范例是覆盖 defaultEJBPersistentTimerExecutor 实例,以便您从 defaultEJBPersistentTimerExecutor 实例继承缺省值。
例如,仅覆盖重试限制:
<persistentExecutor id="defaultEJBPersistentTimerExecutor" retryLimit="50"/>
- 对持久性计时器任务定制数据库存储
- 持久性 EJB 计时器任务保存至数据库。与该数据库相关的配置组合到 databaseStore 配置元素下。除非另行配置,否则名为 defaultDatabaseStore 的 databaseStore 实例用于持久性 EJB 计时器,并供需要数据库的其他产品功能部件使用。覆盖 defaultDatabaseStore 实例的示例:
<databaseStore id="defaultDatabaseStore" dataSourceRef="DB2DataSource" tablePrefix="MYTIMERS"/>
将 defaultEJBPersistentTimerExecutor 实例配置为使用另一 databaseStore 实例的示例:<persistentExecutor id="defaultEJBPersistentTimerExecutor" taskStoreRef="MyDBStore"/> <databaseStore id="MyDBStore" dataSourceRef="DB2DataSource" tablePrefix="MYTIMERS"> <authData user="user1" password="password1"/> </databaseStore>
- 启用和禁用持久性计时器任务执行
持久性 EJB 计时器任务被允许在安排它们的事务落实时运行。为阻止持久性计时器任务运行,可将 enableTaskExecution 属性配置为值 false,在此情况下,EJB 计时器服务仍将持久性计时器任务写至数据库,但不运行这些任务。如果值切换为 true,那么 EJB 计时器服务将开始运行先前安排的计时器及所有已安排的新计时器。
- 为计时器任务定制持久性存储的轮询
- 系统将在启动时执行一次持久性存储的初始轮询,以查找任何先前安排的计时器任务。安排任务时,有关所安排的下一次运行时间的信息将存储并保留在内存中,从而不必进一步轮询持久性存储。此行为在许多情况下很理想,但可能并非始终令人满意。
- 如果计时器任务与其他服务存在外部依赖关系,那么初始轮询可能发生得太快,计时器任务可能因为它们需要的外部服务不可用而失败。如果发生此情况,那么可使用初始轮询延迟以将初始轮询延迟固定时间量。
- 如果安排了大量 EJB 持久性计时器,那么它们可能消耗过多内存。在此情况下,可配置轮询时间间隔来定期轮询持久性存储以仅查找您要在该时间间隔内运行的计时器任务,直到下一次轮询。轮询大小进一步限制每个轮询时间间隔中可从数据库读取的计时器任务数,这可能导致某些任务延迟运行。
示例配置:<persistentExecutor id="defaultEJBPersistentTimerExecutor" initialPollDelay="5m" pollInterval="10m" pollSize="200"/>
- 针对失败的和回滚的持久性计时器任务的重试
持久性 EJB 计时器执行失败或标记为回滚时,系统会立即重试一次这些执行。如果立即重试失败,那么系统会按固定时间间隔重试直到成功。可通过在配置中指定重试限制来限制重试次数。还可通过在配置中指定重试时间间隔来控制重试之间的时间间隔。
示例配置:<persistentExecutor id="defaultEJBPersistentTimerExecutor" retryLimit="100" retryInterval="2m"/>