Spring (2.5.6) 経由で構成された 2 つの Quartz (1.8.3) ジョブがあり、そのうちの 1 つはデータベースへの書き込み (送信) で、もう 1 つはデータベースからの読み取り (チェック) です。
<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 は、Spring を介して注入された TransactionManager Bean です。ログに「ステータスが更新されました」というレコードが表示されますが、トランザクション読み取りメソッドからこのレコードを読み取ると、古いレコードになることがあります。さらに、SQL エディターを使用してこのレコードを読み取ると、それも古くなっています。この場合、トランザクションが機能しない理由がわかりません。アイデアはありますか? ありがとう。