3

我正在尝试每 24 小时读取 CVS 文件并将其插入数据库。我正在使用 Spring Schedular 并且它按预期工作,但是我的应用程序将部署在 3 个不同的 JVM 中,并且所有 JVM 将同时运行,所以有什么办法 schedular 只会为所有三个 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 ,那么代码将尝试每天三次插入数据。”

4

3 回答 3

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();
    }
于 2013-04-16T14:58:47.313 回答
0

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

于 2013-04-17T05:50:24.120 回答
0

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

于 2013-04-16T15:07:14.697 回答