我有一个要求,其中一个微线程将目录中的所有文件存储在数组列表中。列表的大小存储在作业执行上下文中。稍后,在另一个步骤中从另一个微线程访问此计数。这是怎么做到的。我尝试存储在作业执行上下文中,在运行时抛出不可修改的集合异常,
public RepeatStatus execute(StepContribution arg0, ChunkContext arg1)
throws Exception {
StepContext stepContext = arg1.getStepContext();
StepExecution stepExecution = stepContext.getStepExecution();
JobExecution jobExecution = stepExecution.getJobExecution();
ExecutionContext jobContext = jobExecution.getExecutionContext();
jobContext.put("FILE_COUNT",150000);
还在 beforestep 注释中存储了 stepexection 引用。仍然不可能。请让我知道,如何在两个 tasklet 之间共享数据。
你至少有4种可能性:
- 使用 ExecutionPromotionListener 来将数据传递给后续步骤 http://docs.spring.io/spring-batch/trunk/reference/html/patterns.html#passingDataToFutureSteps
- use a (spring) bean to hold inter-step data, e.g. a ConcurrentHashMap
- 访问tasklet中的JobExecutionContext,应谨慎使用,会导致并行步骤的线程问题
- 使用新的jobscope http://docs.spring.io/spring-batch/reference/html/configureStep.html#job-scope(与春季批次 3 一起引入)
从 Tasklet 访问 JobExecution 的代码示例:
-
设置一个值
public class ChangingJobExecutionContextTasklet implements Tasklet {
/** {@inheritDoc} */
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
// set variable in JobExecutionContext
chunkContext
.getStepContext()
.getStepExecution()
.getJobExecution()
.getExecutionContext()
.put("value", "foo");
// exit the step
return RepeatStatus.FINISHED;
}
}
-
提取一个值
public class ReadingJobExecutionContextTasklet implements Tasklet {
private static final Logger LOG = LoggerFactory.getLogger(ChangingJobExecutionContextTasklet.class);
/** {@inheritDoc} */
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
// pull variable from JobExecutionContext
String value = (String) chunkContext
.getStepContext()
.getStepExecution()
.getJobExecution()
.getExecutionContext()
.get("value");
LOG.debug("Found value in JobExecutionContext:" + value);
// exit the step
return RepeatStatus.FINISHED;
}
}
我为前 3 个解决方案创建了代码示例我的 spring-batch-examples github 存储库 https://github.com/langmi/spring-batch-examples,参见模块complex和包装步间通讯
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)