如何从RAMJobStore迁移到JobStoreCMT,用于Seam中持久化的Quartz作业

时间:2011-10-08 15:11:55

标签: java seam quartz-scheduler scheduler

我试图得到一个在JBoss Seam 2.2.0.GA中工作的Quartz调度程序的简单示例。使用RAMJobStore设置一切正常,但从

更改商店
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

org.quartz.jobStore.class org.quartz.impl.jdbcjobstore.JobStoreCMT
org.quartz.jobStore.driverDelegateClass org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
org.quartz.jobStore.useProperties false
org.quartz.jobStore.dataSource quartzDatasource
## FIXME Should be a different datasource for the non managed connection.
org.quartz.jobStore.nonManagedTXDataSource quartzDatasource
org.quartz.jobStore.tablePrefix qrtz_
org.quartz.dataSource.quartzDatasource.jndiURL java:/quartzDatasource

允许调度程序启动,但是该作业以前被触发并以正确的时间间隔运行,现在它根本不运行。石英数据库也没有任何内容。

我知道nonManagedTXDataSource不应该与托管数据源相同,但是我遇到了Quartz无法找到数据源的问题,即使之前有一条消息报告它被绑定成功(这可能是在一个单独的问题中提出的)。使用相同的数据源可以使服务无错误地启动。

我的components.xml文件包含以下内容:

<event type="org.jboss.seam.postInitialization"> 
   <action execute="#{asyncResultMapper.scheduleTimer}"/> 
</event>
<async:quartz-dispatcher/>

和ASyncResultMapper具有以下内容:

@In
ScheduleProcessor processor;
private String text = "ahoy";
private QuartzTriggerHandle quartzTriggerHandle;

public void scheduleTimer() {
    String cronString = "* * * * * ?";
    quartzTriggerHandle = processor.createQuartzTimer(new Date(), cronString, text);
}

和ScheduleProcessor如下:

@Name("processor")
@AutoCreate
@Startup
@Scope(ScopeType.APPLICATION)
public class ScheduleProcessor { 

    @Asynchronous
    public QuartzTriggerHandle createQuartzTimer(@Expiration Date when, @IntervalCron String interval, String text) {
        process(when, interval, text);
        return null;
    }

    private void process(Date when, String interval, String text) {
        System.out.println("when = " + when);
        System.out.println("interval = " + interval);
        System.out.println("text = " + text);
    }
}

日志显示服务已启动,但与工作无关:

INFO  [QuartzScheduler] Quartz Scheduler v.1.5.2 created.
INFO  [JobStoreCMT] Using db table-based data access locking (synchronization).
INFO  [JobStoreCMT] Removed 0 Volatile Trigger(s).
INFO  [JobStoreCMT] Removed 0 Volatile Job(s).
INFO  [JobStoreCMT] JobStoreCMT initialized.
INFO  [JobStoreCMT] Freed 0 triggers from 'acquired' / 'blocked' state.
INFO  [JobStoreCMT] Recovering 0 jobs that were in-progress at the time of the last shut-down.
INFO  [JobStoreCMT] Recovery complete.
INFO  [JobStoreCMT] Removed 0 'complete' triggers.
INFO  [JobStoreCMT] Removed 0 stale fired job entries.
INFO  [QuartzScheduler] Scheduler FlibScheduler$_NON_CLUSTERED started.

我确信这可能是我错过的一些微不足道的事情,但我无法在任何地方的论坛找到解决方案。

1 个答案:

答案 0 :(得分:1)

最终为自己解决这个问题。 JobStoreCMT版本无法启动和触发作业的问题是由缺少@Transactional(感谢tair)的混合引起的,更重要的是需要升级Quartz。一旦Quartz升级到1.8.5,错误消息就会变得更加有用。