Jakarta ee Quartz未参与EJB事务(在CMT模式下)

Jakarta ee Quartz未参与EJB事务(在CMT模式下),jakarta-ee,transactions,ejb,quartz-scheduler,jta,Jakarta Ee,Transactions,Ejb,Quartz Scheduler,Jta,我将Quartz2.2.2与运行在Weblogic 12.1.2中的Java EE应用程序集成。我想用我的容器(Weblogic)处理所有JTA事务。 但是,当发生异常时,除了quartz事务之外,所有事务都会回滚,我认为问题会回到quartz.properties这里是我的配置文件: org.quartz.scheduler.instanceName = MyScheduler org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.J

我将Quartz2.2.2与运行在Weblogic 12.1.2中的Java EE应用程序集成。我想用我的容器(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
我将托管事务的数据源和非托管事务的数据源设置为同一个数据源,这似乎是错误的!但是我不明白为什么我应该设置
非管理的xdatasource
,而这个字段是必需的! 在quartz网站的文件中,建议:

JobStoreCMT需要包含连接的(第二个)数据源 这将不是容器管理事务的一部分。价值 此属性必须是中定义的一个数据源的名称 配置属性文件。此数据源必须包含非CMT 连接,或者换句话说,连接是合法的 Quartz直接调用上的commit()和rollback()

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

代码示例:

@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);
    }
}
和与quartz一起工作的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
class代码:

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

}

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

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

您能提供一些示例代码吗?添加示例代码以打印Quartz正在使用的事务id我的配置文件中没有任何错误吗?我应该为托管和非托管事务数据源使用相同的数据源名称吗?而且打印事务ID并不容易,因为它是由容器处理的,我只访问seRollbackOnly和getRollBackOnly