gpt4 book ai didi

java - 在 Quartz 中使用 JobStoreCMT - 防止自动提交

转载 作者:行者123 更新时间:2023-12-01 05:48:15 27 4
gpt4 key购买 nike

我正在尝试通过以下代码在 Quartz 中使用 JDBC Job Store:

DateTime dt = new DateTime().plusHours(2);

JobDetail jobDetail = new JobDetail(identifier, "group", TestJob.class);
SimpleTrigger trigger = new SimpleTrigger(identifier, dt.toDate());

trigger.setJobName(identifier);
trigger.setJobGroup("group");

quartzScheduler.addJob(jobDetail, true);
quartzScheduler.scheduleJob(trigger);

并按如下方式配置调度程序:

<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false">
<property name="autoStartup" value="true" />
<property name="waitForJobsToCompleteOnShutdown" value="false" />
<property name="dataSource" ref="schedulerDataSource" />
<property name="nonTransactionalDataSource" ref="nonTXdataSource" />
<property name="quartzProperties">
<props>
<!--Job Store -->
<prop key="org.quartz.jobStore.driverDelegateClass">
org.quartz.impl.jdbcjobstore.StdJDBCDelegate
</prop>

<prop key="org.quartz.jobStore.class">
org.quartz.impl.jdbcjobstore.JobStoreCMT
</prop>
<prop key="org.quartz.jobStore.tablePrefix">QRTZ_</prop>
</props>
</property>
</bean>

schedulerDataSource是标准 JNDI 数据源,nonTXdataSource通过简单的 org.springframework.jdbc.datasource.DriverManagerDataSource 配置我已将作业存储类指定为: o rg.quartz.impl.jdbcjobstore.JobStoreCMT并希望代码:

quartzScheduler.addJob(jobDetail, true);
quartzScheduler.scheduleJob(trigger);

调用each方法时不会将作业提交到数据库。基本上,当我调用 addJob 时,作业会立即保存到数据库中,scheduleJob 方法也会导致触发器信息立即保存在数据库中,但这往往已经发生在两个单独的事务中。

代码中有相当多的后续逻辑需要与一个事务中的计划作业一起提交到数据库,但是无论我尝试什么,调度程序都会将作业提交到数据库他们的方法被调用。我尝试了各种环境Testing/Tomcat/Glassfish以及数据源的各种配置,但没有成功。

有人可以指出我出错的方向吗?

谢谢。

最佳答案

经过深思熟虑,现在我相信您可以通过提供自己的包装DataSource来实现这一点,但您不应该这样做。我认为 Quartz 在内存中维护一些必须与数据库同步的内部状态(或者至少它可以这样做)。如果您回滚事务或以其他方式修改数据库状态而不通知 Quartz 这一事实,则它可能无法按预期工作。

另一方面,您可以使用 Quartz 的作业暂停来实现类似的效果:您只需创建新作业并在添加任何触发器之前暂停它即可。然后,只有在提交事务后才能恢复它。

----------------------我原来的答案----------------------

我认为,但我不确定,没有尝试过,您可以尝试以下操作:

您需要围绕内部使用 DataSource.getConnection 的代码进行事务。为了实现这一点,您必须使用了解全局事务状态的数据源。我认为 JBoss 应用程序服务器可以满足您的需求(即使使用纯数据源)。

JBoss 附带事务管理器 (Arjuna) 和数据源包装器(JBoss 应用程序服务器内部),它们至少了解全局事务状态。

其他选项包括 Atomikos 和 XA 数据源,但我在这方面的经验较少。

编辑:如果 Quartz 在内部使用显式的 COMMITsetAutocommit(true),我的建议都不起作用。

关于java - 在 Quartz 中使用 JobStoreCMT - 防止自动提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5349401/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com