2016-05-07 4 views
0

Я интегрировал 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 завершает транзакцию транзакций контейнера, но задание добавляется в базу данных планировщика кварца.

+0

Можете ли вы предоставить пример кода? – Jaumzera

+0

Код примера добавлен – AliReza19330

+0

Попробуйте распечатать идентификатор транзакции, который использует Quartz – Jaumzera

ответ

0

Через некоторое время я обнаружил, что это была моя ошибка! Возможно, это должен быть комментарий, но я думаю, что это может быть более полезно, если я отправлю его в качестве ответа. Моя ошибка была в конфигурации источника данных Weblogic. Я должен был включить Поддержка глобальной транзакции в конфигурации транзакции источника данных.