Java Spring批处理-作业实例已存在:JobInstanceAlreadyCompleteException
我编写了一个包含在Spring应用程序中的easy调度程序。我运行本地服务器,几秒钟后,在类导入器中,checker.start()每5秒钟被调用一次,就像我在配置文件中配置的那样 之后,这个方法用JobLauncher调用Job,这里我得到了一个错误 org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException: 作业实例已存在,并且已完成p参数={}。如果 如果要再次运行此作业,请更改参数 我找到了一个解决方案,如何使用注释修复它,但我希望保持这种方式 先谢谢你Java Spring批处理-作业实例已存在:JobInstanceAlreadyCompleteException,java,spring,batch-processing,Java,Spring,Batch Processing,我编写了一个包含在Spring应用程序中的easy调度程序。我运行本地服务器,几秒钟后,在类导入器中,checker.start()每5秒钟被调用一次,就像我在配置文件中配置的那样 之后,这个方法用JobLauncher调用Job,这里我得到了一个错误 org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException: 作业实例已存在,并且已完成p参数={}。如果 如果要再次运行此作业,请更改参数 我找到了
public class Importer {
private Checker checker;
public Importer() {
}
public void myMethod() {
try {
checker.start();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用.xml文件:
<bean id="schedulerTask"
class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
<property name="targetObject" ref="fileimport" />
<property name="targetMethod" value="myMethod" />
</bean>
<bean id="fileimport" />
<property name="targetMethod" value" class="com...Importer">
<property name="checker">
<bean id="checker" class="com...Checker">
</bean>
</property>
</bean>
<bean id="scheduledTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="timerTask" ref="schedulerTask" />
<property name="delay" value="${xyz.startdelay}" />
<property name="period" value="${xyz.checkinterval}" />
</bean>
<bean class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list>
<ref local="scheduledTask" />
</list>
</property>
</bean>
我的“simplefile context.xml”文件如下所示:
<bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
<property name="transactionManager" ref="transactionManager"/>
</bean>
<!-- bean for lauching the job -->
<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository" />
</bean>
<task:executor id="taskExecutor" pool-size="100" />
<!-- -->
<!-- JOBS -->
<!-- -->
<batch:job id="fileBatch" restartable="true">
<batch:step id="readLines" >
<batch:tasklet task-executor="taskExecutor" >
<batch:chunk reader="fileReader" writer="fooWriter" commit-interval="100" />
</batch:tasklet>
</batch:step>
</batch:job>
<bean id="fileReader" class="org.springframework.batch.item.file.FlatFileItemReader">
<property name="linesToSkip" value="1"/>
<property name="resource" value="file:./src/main/resources/sample.csv" />
<property name="lineMapper" ref="lineMapper" />
</bean>
<bean id="lineMapper" class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
<property name="lineTokenizer" ref="lineTokenizer"/>
<property name="fieldSetMapper" ref="fieldsetEntityMapper"/>
</bean>
<bean id="lineTokenizer" class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
<property name="delimiter" value=";" />
<property name="names" value="field1,field2,field3,field4,field5,field6,field7" />
<property name="strict" value="false"/>
</bean>
<bean id="fieldsetEntityMapper" class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper">
<property name="targetType" value="com...model.ModelObject"/>
<property name="customEditors">
<map>
<entry key="java.lang.Double">
<bean class="org.springframework.beans.propertyeditors.CustomNumberEditor">
<constructor-arg index="0" value="java.lang.Double"/>
<constructor-arg index="1" value="true"/>
</bean>
</entry>
</map>
</property>
</bean>
<bean id="fooWriter" class="com...springbatch.writer.FooWriter" />
使用当前设置,您只能启动作业一次
launcher.run(job, new JobParameters());
作业是唯一的,由其id
和参数标识。目前无法根据参数进行区分。不要添加新作业参数()
使用作业参数BuilderBuilder
并添加当前日期和时间
JobParametersBuilder builder = new JobParametersBuilder();
builder.addDate("date", new Date());
launcher.run(job, builder.toJobParameters());
这将允许您多次运行作业 Yon还可以包括使其更独特的时间,因为我在测试中遇到了相同的错误并传递了相同的JobParameters
JobParameters jobParameters = new JobParametersBuilder()
.addDate("date", new Date())
.addLong("time",System.currentTimeMillis()).toJobParameters();
在Application.property文件中 添加缺少的新字段 spring.batch.initializeschema=始终
spring.batch.job.enabled=false将该行添加到
jobBuilderFactory
chain
.incrementer(new RunIdIncrementer())
接下来(当您使用jobLauncher
和自定义JobParameters
手动运行作业时)
而不是
.addDate(“date”,new date())代码>就像他们向您提供的建议一样是否有与此等效的xml?
.incrementer(new RunIdIncrementer())
paramsBuilder.getNextJobParameters(job);