我正在尝试读取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,那么代码将尝试每天三次插入数据。”
答案 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从上面提到的锁定建议我得到了这个想法。