Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 每24小时一次的Spring计划_Java_Spring - Fatal编程技术网

Java 每24小时一次的Spring计划

Java 每24小时一次的Spring计划,java,spring,Java,Spring,我试图每24小时读取一次CVS文件并将其插入数据库。我使用Spring Schedular,其工作方式与预期一致,但我的应用程序将部署在3个不同的JVM中,并且所有JVM都将同时运行,所以Schedular是否有可能只对所有3个JVM运行一次,这样它每天只插入一次数据 <bean id="runMeTask" class="com.fifththird.ebusiness.ivr.core.service.RunMeTask" > <prop

我试图每24小时读取一次CVS文件并将其插入数据库。我使用Spring Schedular,其工作方式与预期一致,但我的应用程序将部署在3个不同的JVM中,并且所有JVM都将同时运行,所以Schedular是否有可能只对所有3个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,那么代码将尝试每天插入三次数据。”

您可以使用公共文件作为锁。只有一个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();
    }

如果我理解正确(多台机器上有多个CV和一个db?),这看起来像是JMS队列的一个用例,我们正在使用Java EE,但是有Spring实现

感谢您的响应。我通过在数据库中使用一个表来实现它,该表将检查状态/天(插入是否完成),然后在另一个表中插入csv的值。(这个站点非常令人震惊)。根据上面提到的锁建议,我得到了这个想法。

Thnx作为您的答案,但是如果两个JVM同时调用锁呢?两个JVM不能同时获得文件上的锁