Я интегрировал Quartz2.2.2 с моим приложением Java EE, которое работает в Weblogic 12.1.2. Я хочу обрабатывать все транзакции JTA с моим контейнером (Weblogic). Но когда исключение произошло все rollbacked кварцевых кроме операций, я думаю, что проблема восходит к quartz.properties
здесь мой конфигурационному файл:Quartz не участвует в транзакциях EJB (в режиме CMT)
org.quartz.scheduler.instanceName = MyScheduler
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreCMT
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.oracle.weblogic.WebLogicOracleDelegate
org.quartz.jobStore.dataSource = quartz
org.quartz.threadPool.threadCount = 3
org.quartz.jobStore.nonManagedTXDataSource = quartz
org.quartz.dataSource.quartz.jndiURL = java.weblogic.datasources.quartz
Я установил DataSource как управляемые транзакции и неуправляемой один к тому же источнику данные и это кажется неправильным! Но я не мог понять, почему я должен установить nonManagedTXDataSource
, и это поле обязательно! В документации веб-сайта кварцевой предполагается, что:
JobStoreCMT требует (второй) источник данных, который содержит соединения , которые не будут частью управляемых контейнером транзакций. Значение это свойство должно быть именем одного из данных, определенных в файле свойств конфигурации . Этот источник данных должен содержать соединения, отличные от CMT , или, другими словами, соединения, для которых это законно для Кварц для прямого вызова commit() и отката().
Почему мне нужен такой источник данных, когда я хочу, чтобы все мои транзакции управлялись контейнером!
Пример кода:
@Stateless
public class MyServiceHandlerBean {
@EJB
MyObjectManager objManager;
@EJB
MyScheduler scheduler;
public void addObj() throws MyException {
MyObject obj = new MyObject("fname","lastname");
objManager.save(obj);
scheduler.addJobForObj(obj);
}
}
и MyScheduler
класс, который работает с кварцем:
@LocalBean
@Stateless
public class MyScheduler {
private Scheduler scheduler = null;
public MyScheduler() throws SchedulerException {
scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start();
}
public void addJobForObj(MyObject obj) throws MyException {
JobBuilder jobBuilder = newJob(BaseJob.class).withIdentity(obj.getId());
JobDetail job = jobBuilder.build();
try {
// Does something to create triggers
scheduler.scheduleJob(job, triggers, false);
} catch (SchedulerException e) {
throw new MyException("Something");
} catch (MyException e) {
throw e;
}
}
}
и здесь MyException
код класса:
@ApplicationException(rollback=true)
public class MyException extends Exception{
}
Проблема заключается в том, когда я звоню MyServiceHandlerBean
метод (addObj
) при сохранении o peral of MyObjectManager
завершает транзакцию транзакций контейнера, но задание добавляется в базу данных планировщика кварца.
Можете ли вы предоставить пример кода? – Jaumzera
Код примера добавлен – AliReza19330
Попробуйте распечатать идентификатор транзакции, который использует Quartz – Jaumzera