Quartz 不参与 EJB 事务(在 CMT 模式下)

Quartz is not participating in EJB transactions (in CMT mode)

我将 Quartz2.2.2 与我的 Java EE 应用程序集成在一起,该应用程序在 Weblogic 12.1.2 中是 运行。我想用我的容器 (Weblogic) 处理所有 JTA 事务。 但是当发生异常时,除了 quartz 事务之外的所有内容都会回滚,我认为问题可以追溯到 quartz.properties 这是我的配置文件:

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

我将托管事务的数据源和非托管事务的数据源设置为同一个数据源,这似乎是错误的!但是我不明白为什么我要设置 nonManagedTXDataSource 并且这个字段是必填的! 在石英网站的文档中建议:

JobStoreCMT requires a (second) datasource that contains connections that will not be part of container-managed transactions. The value of this property must be the name of one the DataSources defined in the configuration properties file. This datasource must contain non-CMT connections, or in other words, connections for which it is legal for Quartz to directly call commit() and rollback() on.

当我希望所有事务都由容器管理时,为什么我需要这样的数据源!

代码示例:

@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 class 与石英一起工作:

@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 class 代码:

@ApplicationException(rollback=true)
public class MyException extends Exception{

}

问题是当我调用 MyServiceHandlerBean 方法 (addObj) 时 MyObjectManager 的保存操作失败容器回滚事务但作业被添加到石英调度程序的数据库中。

过了一会儿我发现是我的错误!也许这应该是一条评论,但我认为如果我 post 它作为答案会更有用。我的错误在于 Weblogic 数据源配置。我应该在数据源事务配置中启用 支持全局事务