0

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 エディターを使用してこのレコードを読み取ると、それも古くなっています。この場合、トランザクションが機能しない理由がわかりません。アイデアはありますか? ありがとう。

4

1 に答える 1