gpt4 book ai didi

spring - 从 tasklet 存储在 JobExecutionContext 中并在另一个 tasklet 中访问

转载 作者:行者123 更新时间:2023-12-03 11:32:15 27 4
gpt4 key购买 nike

我有一个要求,其中一个 tasklet 将目录中的所有文件存储在一个数组列表中。列表的大小存储在作业执行上下文中。稍后在另一个步骤中从另一个 tasklet 访问此计数。它是如何做到这一点的。我试图存储在 jobexecution 上下文中,在运行时抛出不可修改的集合异常,

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);

还将stepexecution引用存储在beforestep注释中。仍然不可能。请告诉我,如何在两个tasklet之间共享数据。

最佳答案

你至少有 4 种可能性:

  • 使用 ExecutionPromotionListener 到 pass data to future steps
  • 使用( Spring )bean 来保存步骤间数据,例如一个 ConcurrentHashMap
  • 如果不采取进一步措施,重新启动将无法访问此数据
  • 在你的 tasklet 中访问 JobExecutionContext,应该谨慎使用,会导致并行步骤的线程问题
  • 使用新的 jobscope (随 Spring 批处理 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;
    }
    }

  • 我为 my spring-batch-examples github repository 中的前 3 个解决方案创建了代码示例,见模块复杂和包跨步通信

    关于spring - 从 tasklet 存储在 JobExecutionContext 中并在另一个 tasklet 中访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8117060/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com