我有两个 Quartz (1.8.3) 作业,通过 Spring (2.5.6) 配置,其中一个写入(发送)到数据库,一个从中读取(检查)。
<bean id="scheduleFactory"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="Check"/>
<ref bean="Send"/>
</list>
</property>
</bean>
<bean id="Send" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<bean class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="StatusMonitor" />
<property name="targetMethod" value="sendMessage" />
</bean>
</property>
<property name="cronExpression" value="0 0/1 * * * ?" />
</bean>
<bean id="Check" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<bean class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="StatusMonitor" />
<property name="targetMethod" value="checkAndUpdateStatus" />
</bean>
</property>
<property name="cronExpression" value="30 0/1 * * * ?" />
</bean>
事务管理器设置:
<tx:annotation-driven transaction-manager="TransactionManager"/>
在这两个作业中,我明确地在事务中运行读/写操作,如下所示:
@Override
public synchronized void sendMessage() {
try {
TransactionTemplate tt = new TransactionTemplate(ptm);
tt.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
...
statusDAO.update(status);
...
}
});
log.info("Status was updated");
} catch (Exception e) {
...
}
}
其中 ptm 是一个 TransactionManager bean,通过 Spring 注入。我在日志中看到“状态已更新”记录,但是当我从事务读取方法中读取此记录时,它有时已过时。此外,当我使用 SQL 编辑器读取此记录时,它也已过时。我不明白,为什么交易在这种情况下不起作用,你有什么想法吗?谢谢。