【发布时间】:2018-04-04 14:14:19
【问题描述】:
我目前在 Spring Cloud Data Flow 中的任务调用遇到问题。
我有一个在 SCDF 上注册的 Spring Batch(包含单任务步骤作业)应用程序和一个基于此应用程序的任务定义。在我第一次启动此任务期间,我使用了几个作业参数/参数。由于我现在知道的一个原因,我所有的后续启动都被我使用的第一组参数覆盖。
我使用的是 SCDF 1.4.0 + MSSQL 数据库,但使用 SCDF 1.3.2 + H2 或 MSSQL 也会发生同样的行为。
BatchConfig.java
@Configuration
public class BatchConfig {
@Autowired
TaskletStep taskletStep;
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.tasklet(taskletStep)
.build();
}
@Bean
public Job job() throws Exception {
return jobBuilderFactory.get("job")
.incrementer(new RunIdIncrementer())
.start(step1())
.build();
}
}
TaskletStep.java:
@Configuration
@StepScope
public class TaskletStep implements Tasklet{
@Value("#{jobParameters['filePath']}")
private String filePath;
@Value("#{jobParameters['informante']}")
private String informante;
@Autowired
RemessaParser remessaParserService;
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
GICLogger.info("Recebido job com path: " + filePath + " para o informante "+ informante);
try{
Path remessa = Paths.get(filePath);
if(Files.exists(remessa)){
String idRemessa = remessaParserService.remessaReader(remessa, informante);
GICLogger.info("### TaskletStep:" + idRemessa + " é o ID da Remessa!");
return RepeatStatus.FINISHED;
}else{
GICLogger.error("Não foi possível encontrar a remessa em "+filePath);
}
}catch(Exception e){
e.printStackTrace();
}
return RepeatStatus.FINISHED;
}
}
我的启动命令:
dataflow> task launch negTask --arguments "filePath=/tmp/jars/remessa.txt informante=CaixaB --spring.cloud.task.closecontext_enable=false"
应用日志:
2018-04-04 13:33:28 [main] INFO c.b.g.n.BatchNegativacaoApp - 已启动 BatchNegativacaoApp 在 13.938 秒内(JVM 运行时间为 14.599)
2018-04-04 13:33:28 [主要] 信息 o.s.b.a.b.JobLauncherCommandLineRunner - 运行默认命令行 与:[filePath=/tmp/jars/remessa.txt,informante=Caixa, --spring.cloud.task.closecontext_enable=false, --spring.cloud.task.executionid=17]
2018-04-04 13:33:28 [main] INFO o.s.b.c.l.support.SimpleJobLauncher - Job: [SimpleJob: [name=job]] 使用以下参数启动: [{filePath=/home/enrico/PROJETOS/GIC/java/remessa.txt, -spring.cloud.task.executionid=8, informante=Caixa, -spring.cloud.task.closecontext_enable=false, run.id=12, time=1522842134819}]
你们知道为什么会这样吗?
感谢您的关注和任何意见!
最好的问候, 恩里科
【问题讨论】:
-
这不是问题所在,但您的
TaskletStep上不需要@Configuration。只需使用@Component。上次发布的结果是什么(COMPLETE或FAILED)? -
那我需要扫描我的SpringBootApp类上的组件包吗?无论如何,状态是 FAILED 因为我只是测试 tasklet 的一部分,它不应该成功。这会影响接下来的任务吗?
-
快速更新。通过从 BATCH_JOB_EXECUTION_PARAMS 中删除注册表,我设法使用正确的参数运行了一个新任务,但即将到来的任务仍然给我同样的行为。
-
如果您的作业使用相同的识别参数运行并且最后一次尝试失败,它将默认尝试重新启动上一次运行
-
感谢您帮我解决这个问题!是否有任何解决方法来避免这种行为或改变它?通过识别参数,您的意思是相同的参数名称,而不是它们的值,对吗?关于如何以正确的状态以编程方式完成任务以避免这种情况发生,是否有任何最佳实践?提前致谢!
标签: spring spring-batch spring-cloud-dataflow spring-cloud-task