2013-04-16 89 views
3

我想讀取CVS文件並將其每24小時插入到數據庫中。我使用Spring Schedular並按預期工作,但我的應用程序將部署在3個不同的JVM和所有JVM將同時運行,那麼對於所有三個JVM,schedular將只運行一次,因此它每天只能插入一次數據。Spring Scheduler每24小時

<bean id="runMeTask" 
     class="com.fifththird.ebusiness.ivr.core.service.RunMeTask" > 
      <property name="dataSource" ref="DataSource"/> 
    </bean> 

    <bean id="schedulerTask" 
     class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean"> 
     <property name="targetObject" ref="runMeTask" /> 
     <property name="targetMethod" value="printMe" /> 
    </bean> 

    <bean id="timerTask" 
     class="org.springframework.scheduling.timer.ScheduledTimerTask"> 
     <property name="timerTask" ref="schedulerTask" /> 
     <property name="delay" value="1000" /> 
     <property name="period" value="60000" /> 
    </bean> 

<bean class="org.springframework.scheduling.timer.TimerFactoryBean"> 
    <property name="scheduledTimerTasks"> 
     <list> 
      <ref local="timerTask" /> 
     </list> 
    </property> 
</bean> 

添加到上面的問題:「如果部署在三個不同的JVM相同apllication將撥打電話去春來程序器,那麼代碼將嘗試三次/日來插入數據。」

回答

1

您可以使用通用文件作爲鎖。只有一個JVM可以鎖定,其他人將跳過這一步。要在您需要刪除安全起見/重命名後裝載完成

FileOutputStream out = new FileOutputStream("lock"); 
    try { 
     FileLock lock = out.getChannel().tryLock(); 
     if (lock != null) { 
      try { 
       // load csv 
      } finally { 
       lock.release(); 
      } 
     } 
    } finally { 
     out.close(); 
    } 
+0

Thnx爲您的答案,但如果兩個JVM同時呼叫鎖定,該怎麼辦? – user970500

+0

兩個JVM不能同時獲得文件上的鎖定 –

0

感謝您的response.I已通過使用數據庫中的一個更多的表,將檢查狀態/天(是否插入已完成或不),然後將csv的值插入到另一個表中(這個網站相當不錯).Bcoz從上面提到的鎖定建議中得到了這個想法。