Java 如何为Seam中的持久化Quartz作业从RAMJobStore迁移到JobStoreCMT
我试图得到一个石英调度器在JBossSeam2.2.0.GA中工作的简单示例。使用RAMJobStore设置,一切都可以正常工作,但是将存储从Java 如何为Seam中的持久化Quartz作业从RAMJobStore迁移到JobStoreCMT,java,seam,quartz-scheduler,scheduler,Java,Seam,Quartz Scheduler,Scheduler,我试图得到一个石英调度器在JBossSeam2.2.0.GA中工作的简单示例。使用RAMJobStore设置,一切都可以正常工作,但是将存储从 org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore 到 允许计划程序启动,但作业以前被触发并以正确的时间间隔运行,但现在根本不运行。石英数据库中也没有任何持久性内容 我知道非ManagedTxDataSource不应与托管数据源相同,但我发现Quartz无法找到该数据源,尽管前面有一条消息报
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
到
允许计划程序启动,但作业以前被触发并以正确的时间间隔运行,但现在根本不运行。石英数据库中也没有任何持久性内容
我知道非ManagedTxDataSource不应与托管数据源相同,但我发现Quartz无法找到该数据源,尽管前面有一条消息报告它已成功绑定(这可能将在单独的问题中提出)。使用相同的数据源允许服务无错误地启动
My components.xml文件包含以下内容:
<event type="org.jboss.seam.postInitialization">
<action execute="#{asyncResultMapper.scheduleTimer}"/>
</event>
<async:quartz-dispatcher/>
@In
ScheduleProcessor processor;
private String text = "ahoy";
private QuartzTriggerHandle quartzTriggerHandle;
public void scheduleTimer() {
String cronString = "* * * * * ?";
quartzTriggerHandle = processor.createQuartzTimer(new Date(), cronString, text);
}
调度处理器如下所示:
@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.
我肯定这可能是我错过的一些琐碎的事情,但我在任何地方的论坛上都找不到解决方案。最终为自己解决了这个问题。JobStoreCMT版本无法启动和触发作业的问题是由缺少@Transactional(感谢tair)和更重要的是需要升级Quartz的混合因素造成的。一旦Quartz升级到1.8.5,错误消息就变得非常有用。当使用CMT Quartz无法处理事务时,Seam负责处理。因此,您的createQuartzTimer应该在TX内运行。AFAIK在初始化后还没有运行TX。您是否尝试将@Transactional放在createQuartzTimer上?添加@Transactional没有启动作业。无论使用哪种注释,都会调用该方法(使用简单的日志语句进行检查)。我已经测试了这个设置:JBoss EAP 5.1.1+Seam 2.2.2+quartz 1.6.5+Postgresql 9.1(我们在项目中使用它),它工作得很好。您的日志显示您使用的是与JBoss AS捆绑在一起的较旧的quartz 1.5.2版本,但是Seam是根据1.6 api进行测试的。我认为您实际上指的是@Transactional
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.