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