2012-04-05 52 views
0

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エディタを使用してこのレコードを読み取ると、古くなってしまいます。 私は理解していない、トランザクションがこの場合には機能しない理由はありますか?おかげさまで

+0

'statusDAO' transactionnal(つまり@Transactionnalアノテーションなど)ですか? –

+0

まだこの問題がありますか? –

+0

問題が "時には"発生する(しかし、毎回ログメッセージが出力される)場合は、永続性ロジックに脆弱性がある可能性があります(JDBCまたはHibernate?)。 "doInTransactionWithoutResult"関数の内容をすべてのネストされた呼び出しでチェックしてください。もっと正確にするにはもっとコードが必要です。最小限のテスト分離問題を作成できれば、それは役に立ちます。 –

答えて

1

興味のある方のために。これはapplicationDataCollectorService豆-----

public void collectData(org.springframework.transaction.jta.JtaTransactionManager transactionManager) { 



     try { 
      this.transactionManager = transactionManager; 
      testTransactionalSave(); 

     } catch (Exception e) { 
      BUSY = false; 
      e.printStackTrace(); 
     } 

    } 

} 

private void testTransactionalSave() throws Exception { 

    TransactionTemplate tt = new TransactionTemplate(transactionManager); 
    tt.execute(new TransactionCallbackWithoutResult() { 
     @Override 
     protected void doInTransactionWithoutResult(TransactionStatus ts) { 
      try { 
       ApplicationParameter appPara = null; 
       List<ApplicationParameter> appParaList = genericService.getListFromHQL("select o from ApplicationParameter as o order by o.id desc", false); 
       if (appParaList != null) { 
        if (appParaList.size() > 0) { 
         appPara = (ApplicationParameter) appParaList.get(0); 
         appPara.setLastBankStatementMailNum(appPara.getLastBankStatementMailNum() + 10); 

         appPara = (ApplicationParameter) genericService.mergeObject(appPara); 

         System.out.println(" num is now = " + appPara.getLastBankStatementMailNum()); 
        } 
       } 
      } catch (Exception ex) { 
       ex.printStackTrace(); 

      } 
     } 
    }); 

} 

ノートでは---- ---スケジューラ豆に---私

<bean name="applicationDataCollectorControllerJobDetail" class="org.springframework.scheduling.quartz.JobDetailBean"> 
    <property name="jobClass" value="org.mypckage.controller.jobs.ApplicationDataCollectorController" /> 
    <property name="jobDataAsMap"> 
     <map> 
      <!--<entry key="timeout" value="1" />--> 
      <entry key="genericService" value-ref="genericService" /> 


      <entry key="applicationDataCollectorService" value-ref="applicationDataCollectorService" /> 

      <entry key="transactionManager" value-ref="transactionManager" /> 

     </map> 
    </property> 



</bean> 

ため

@Override 
protected void executeInternal(JobExecutionContext ctx) throws JobExecutionException { 

getApplicationDataCollectorService().collectData(transactionManager); 


} 

を働きました:両方のbeanのprivateプロパティとしてtransactionManagerを宣言するのを忘れないでください。質問は? [email protected]

関連する問題