Spring Scheduler每24小时一次

时间:2013-04-16 14:50:12

标签: java spring

我正在尝试读取CVS文件并在24小时内将其插入到数据库中。我正在使用Spring Schedular并按预期工作,但我的应用程序将部署在3个不同的JVM中,并且所有JVM都将在同一个JVM中运行时间,所以有任何方式调度只会对所有三个JVM运行一次,所以它每天只会插入一次数据。

<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中部署相同的应用程序将调用spring schedular,那么代码将尝试每天三次插入数据。”

3 个答案:

答案 0 :(得分:1)

您可以将公共文件用作锁。只有一个JVM可以获取锁定,其他JVM会跳过该步骤。为了安全起见,您需要在加载完成后删除/重命名文件

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

答案 1 :(得分:0)

如果我理解正确(多台机器上的多个cvs和一个db?),它看起来像JMS Queue的一个用例我们正在使用Java EE但是有Spring实现http://static.springsource.org/spring/docs/2.5.3/reference/jms.html

答案 2 :(得分:0)

感谢您的回复。我已经通过在数据库中再使用一个表来检查状态/日(是否已完成插入),然后在另一个表中插入csv的值。网站是非常棒的.Bcoz从上面提到的锁定建议我得到了这个想法。