Как выполнить миграцию из RAMJobStore в JobStoreCMT для сохраненных заданий Quartz в Seam - PullRequest
1 голос
/ 08 октября 2011

Я пытаюсь получить простой пример планировщика Quartz, работающего в JBoss Seam 2.2.0.GA. Все отлично работает с настройкой 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, даже если ранее сообщалось о том, что он успешно связан ( это, вероятно, собирается быть задан в отдельном вопросе). Использование того же источника данных позволяет службе запускаться без ошибок.

В файле Мои компоненты.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 Ответ

1 голос
/ 14 октября 2011

Удалось решить это для себя в итоге. Проблема версии JobStoreCMT, не запускающей и не запускающей задания, была вызвана смешанным отсутствием @Transactional (спасибо tair) и, что более важно, необходимостью обновления Quartz. После обновления Quartz до 1.8.5 сообщения об ошибках стали намного полезнее.

...