JBoss Seam 2.2.0.GA에서 작동하는 Quartz 스케줄러의 간단한 예제를 얻으려고합니다. 작업이 이전 트리거하고 올바른 간격으로 실행되고 있던 반면, 모든 것이 잘의 RAMJobStore 설정을 사용하지만,Seam의 지속 된 Quartz 작업을 위해 RAMJobStore에서 JobStoreCMT로 마이그레이션하는 방법
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
에
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
에서 가게를 변경 허용 스케줄러를 시작하는 것이 아니라 작품 지금은 전혀 실행되지 않습니다. 석영 데이터베이스에는 아무 것도 없습니다.
nonManagedTXDataSource가 관리되는 데이터 소스와 같지 않아야한다는 것을 알고 있지만 Quartz에서 데이터 소스를 찾을 수 없다는 문제가 있습니다. 이전에 성공적으로 바인딩되었다고보고하는 메시지가 있지만 (이것은 아마 별도의 질문에서 물어볼 예정 임). 동일한 데이터 소스를 사용하면 서비스를 오류없이 시작할 수 있습니다.
<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);
}
}
로그는 보여
내 components.xml 파일에는 다음이 서비스는 시작하지만 그 일에 대해서는 아무 것도 :
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.
내가보기에는 그다지 사소한 것이 분명하지만, 포럼 어디에서나 해결책을 찾을 수는 없습니다.
CMT를 사용할 때 Quartz는 트랜잭션을 처리하지 않으므로 Seam이 책임진다. 따라서 createQuartzTimer는 TX 내부에서 실행되어야합니다. AFAIK 이미 postInitialization에서 TX를 실행하지 않습니다. createQuartzTimer에 @Transactional을 넣으려고 했습니까? – Tair
@Transactional을 추가해도 작업이 시작되지 않았습니다. 어노테이션이 사용되는 경우에도 메소드는 여전히 호출됩니다 (간단한 로깅 명령문으로 점검). – spikeheap
JBoss EAP 5.1.1 + Seam 2.2.2 + quartz 1.6.5 + PostgreSQL 9.1 (우리는 프로젝트에서 사용함)이 설정을 테스트 했으므로 제대로 작동합니다. JBoss AS에 번들로 제공되는 구형 1.5.2 버전의 석영을 사용 중이지만 Seam은 1.6 API에 대해 테스트되었습니다. – Tair