我有一个春季批次(2.2.2)应用程序,由于某种原因无法使作业参数增量工作。该步骤声明为:
<job id="job1" xmlns="http://www.springframework.org/schema/batch" incrementer="incrementer">
<step id="step1" parent="step" />
</job>
<bean id="incrementer" class="org.springframework.batch.core.launch.support.RunIdIncrementer" />
当我在增量器中放置一个断点时,它甚至都没有被调用。
使用相同参数调用作业两次会产生以下异常:
A job instance already exists and is complete for parameters={fail=false}. If you want to run this job again, change the parameters.
我在这里检查了官方样本
https://github.com/spring-projects/spring-batch-admin/tree/master/spring-batch-admin-sample
并且它有同样的问题
答案 0 :(得分:1)
我看到没有人给你一个正确的答案,所以就是这样(即使它迟了一年也许会帮助别人):
你可以直接调用的主要功能 CommandLineJobRunner类。 例如:
String[] args = new String[]{"spring/batch/jobs/helloWorldJob.xml", "helloWorldJob", "name(string)=Spring", "-next"};
CommandLineJobRunner.main(args);
基本上,当您从命令行(或任何其他Java应用程序)运行Spring Batch时,您正在执行此操作。
答案 1 :(得分:1)
旧问题,但仍适用于当前版本(3.0.5):
如果您通过
开始执行作业Incrementer.getNext(JobParameters)
使用例如getNext()
类,然后永远不会调用增量器。如果您检查方法 if (opts.contains("-next")) {
JobParameters nextParameters = getNextJobParameters(job);
Map<String, JobParameter> map = new HashMap<String, JobParameter>(nextParameters.getParameters());
map.putAll(jobParameters.getParameters());
jobParameters = new JobParameters(map);
}
JobExecution jobExecution = launcher.run(job, jobParameters);
的“呼叫者”,则呼叫者的数量是有限的:
CommandLineJobRunner在调用启动器之前,在“-next”上有条件地调用if (lastInstances.isEmpty()) {
parameters = incrementer.getNext(new JobParameters());
if (parameters == null) {
throw new JobParametersNotFoundException("No bootstrap parameters found for job=" + jobName);
}
}
else {
List<JobExecution> lastExecutions = jobExplorer.getJobExecutions(lastInstances.get(0));
parameters = incrementer.getNext(lastExecutions.get(0).getJobParameters());
}
logger.info(String.format("Attempting to launch job with name=%s and parameters=%s", jobName, parameters));
try {
return jobLauncher.run(job, parameters).getId();
}
catch (JobExecutionAlreadyRunningException e) {
throw new UnexpectedJobExecutionException(String.format(ILLEGAL_STATE_MSG, "job already running", jobName,
parameters), e);
}
:
UPDATE mara
SET
zzmanu = wa-sales_data2-zzmanu
zzmatnr_sf = wa-sales_data2-zzmatnr_sf
WHERE matnr = wa-basic_data1-matnr.
if sy-subrc eq 0.
commit work.
wait up to 2 seconds.
ENDIF.
Spring Admin Web应用程序使用它,它与CommandLineJobRunner中的实现基本相同:
{{1}}
因此,如果您正在使用JobLauncher类来启动作业,则在调用jobLauncher以使用所需的值增强作业参数之前,必须自己调用增量器。
答案 2 :(得分:0)
如果使用CommandLineJobRunner
运行,请使用-next
选项,否则最佳解决方案是使用时间戳作业参数使每个作业实例与其他作业实例不同。