Jakarta ee Quartz未参与EJB事务(在CMT模式下)
我将Quartz2.2.2与运行在Weblogic 12.1.2中的Java EE应用程序集成。我想用我的容器(Weblogic)处理所有JTA事务。 但是,当发生异常时,除了quartz事务之外,所有事务都会回滚,我认为问题会回到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
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