在春季批次中的步骤之间交换数据

时间:2014-06-05 11:21:25

标签: spring-batch

我有一份由以下组件构建的工作

  1. 处理步骤 - 激活外部处理,将其结果记录在数据库中并返回内部ID ,以便我可以获取此ID并进一步处理
  2. 日志记录步骤 - 由包含块
  3. 的tasklet构建

    这个块是由一个项目阅读器构建的 - 我计划使用#{stepExecutionContext ['job.id']} 作为xml文件中编写的sql的一部分,这样它就会得到相关的日志信息

    我正在尝试使用此处建议的解决方案 - 11.8 Passing Data to Future Steps但是当我尝试在步骤执行上下文作业上添加属性时出现此错误执行背景

    chunkContext.getStepContext().getStepExecutionContext().put("job.id", jobId);
    

    我收到了这个错误:

    java.lang.UnsupportedOperationException: null
    at java.util.Collections$UnmodifiableMap.put(Collections.java:1342)
    at  ...
    at  org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:395)
    

    我错过了什么吗?

3 个答案:

答案 0 :(得分:3)

ChunkContext提供的StepContext是一个只读对象;使用StepExecutionListener并保存作为方法StepExecutionListener.afterStep(StepExecution stepExecution)

中的参数传递的步骤执行上下文

答案 1 :(得分:0)

chunkContext.getStepContext()。getStepExecutionContext()重新运行副本使用chunkContext.getStepContext()。getStepExecution()。getExecutionContext()

答案 2 :(得分:0)

我总是遵循以下路径:

chunkContext
    .getStepContext()
    .getStepExecution()
    .getJobExecution()
    .getExecutionContext()
    .put("", "");

我在执行StepExecution时也遇到了问题。 进行下一步时,可能会丢失数据。 但是,我将最后一句话留给最专家。