2つのQuartz(1.8.3)ジョブがSpring(2.5.6)で設定され、そのうちの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"/>
:
PTMが注入され、トランザクションマネージャーBeanです@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) {
...
}
}
春を経て "ステータスが更新されました"というレコードがログに記録されていますが、トランザクション読み取りメソッドからこのレコードを読み取ると、時代遅れになることがあります。さらに、SQLエディタを使用してこのレコードを読み取ると、古くなってしまいます。 私は理解していない、トランザクションがこの場合には機能しない理由はありますか?おかげさまで
'statusDAO' transactionnal(つまり@Transactionnalアノテーションなど)ですか? –
まだこの問題がありますか? –
問題が "時には"発生する(しかし、毎回ログメッセージが出力される)場合は、永続性ロジックに脆弱性がある可能性があります(JDBCまたはHibernate?)。 "doInTransactionWithoutResult"関数の内容をすべてのネストされた呼び出しでチェックしてください。もっと正確にするにはもっとコードが必要です。最小限のテスト分離問題を作成できれば、それは役に立ちます。 –