【发布时间】:2016-05-07 14:09:19
【问题描述】:
我将 Quartz2.2.2 与在 Weblogic 12.1.2 中运行的 Java EE 应用程序集成。我想用我的容器(Weblogic)处理所有 JTA 事务。
但是当发生异常时,除了石英事务外,所有内容都会回滚,我认为问题可以追溯到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 需要包含连接的(第二个)数据源 这不会是容器管理事务的一部分。的价值 此属性必须是其中定义的数据源之一的名称 配置属性文件。此数据源必须包含非 CMT 连接,或者换句话说,合法的连接 Quartz 直接调用 commit() 和 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 与石英一起使用的类:
@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)时,MyObjectManager 的保存操作失败,容器回滚事务,但作业被添加到石英调度程序的数据库中。
【问题讨论】:
-
你能提供一些示例代码吗?
-
添加示例代码
-
尝试打印出 Quartz 正在使用的事务 id
-
我的配置文件有什么问题吗?我应该对托管和非托管事务数据源使用相同的数据源名称吗?
-
而且没有那么容易打印出事务ID,因为它是由容器处理的,我只是访问seRollbackOnly和getRollBackOnly
标签: jakarta-ee transactions ejb quartz-scheduler jta