当前位置: 首页 > 面试题库 >

从Tasklet存储在JobExecutionContext中并在另一个Tasklet中访问

司寇书
2023-03-14
问题内容

我需要一个tasklet,将所有文件存储在arraylist目录中。列表的大小存储在作业执行上下文中。稍后,可以在另一个步骤中从另一个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);

还在步骤注释中存储了步骤执行参考。仍然无法实现。请让我知道如何在两个小任务之间共享数据。


问题答案:

你至少有4种可能性:

  1. 使用ExecutionPromotionListener 将数据传递到以后的步骤
  2. 使用(spring)bean来保存步间数据,例如ConcurrentHashMap
    如果不采取进一步措施,该数据将无法重新启动
  3. 访问你的tasklet中的JobExecutionContext,应谨慎使用,这将导致并行步骤出现线程问题
  4. 使用新的jobscope(引入的弹簧批次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;
    }
}


 类似资料:
  • Tasklet是一个简单的任务管理框架,主要用于将一个大任务分割成许多较小的子任务,并管理这些子任务的执行。Tasklet主要有以下4个类: Task : 任务/子任务,多个Task组成一个完整的任务/功能。 Manager : 任务/子任务的执行入口。通过内部维护一个Task容器来管理要运行的Task。 Context : 为子任务提供运行环境的上下文消息和服务。 Launcher: 启动一个完

  • 问题内容: 我知道有进程上下文和中断上下文,但是我不知道在执行softirq或tasklet时会在哪个上下文下运行。 我已经看到有些人使用“下半上下文”一词,如果有这样的话,与其他人相比有什么区别。 softirq和tasklet的另一个问题是为什么执行期间不允许睡眠? 谁能帮助我确定这些问题,谢谢! 问题答案: softirq和tasklet都是下半部机制。不允许睡眠,因为它们在中断上下文而不是

  • 问题内容: 我在批处理作业中有执行不同操作的步骤。 但是在开始所有这些步骤之前,我需要清除一个表。有没有简单的方法可以编写Tasklet来直接从Job xml文件中删除表? 我正在使用ibatis作为ORM 问题答案: 您的意思甚至比Tasklet更简单,例如,像这样的伪代码?

  • 我目前正在构建一个spring批处理应用程序,其中执行了几个步骤。除了一个,所有的步骤都是简单的tasklet(没有读取器或写入器),它们负责各种任务,如复制文件、发送请求、启动批处理(*.bat)文件等。 大多数步骤应该是串行执行的。在一个特定的步骤中,我希望启动X文件,这些文件最多可以有Y个实例。 null 如果:)我想我必须使用taskExecutor,下面我有一个示例,在这里我开始第一步(

  • 问题内容: 我有以下内容: 我如何从另一个ViewController 访问? 我需要访问此功能: 问题答案: 默认情况下,swift中的所有内容都是公开的,因此,如果您声明以下内容: 只要拥有它的实例,就可以访问它:

  • 我试图通过将其存储在ExecutionContext中来跟踪csv文件中每个项的lineNumber。Reader是一个带有修改过的Linemapper的FlatFileItemReader。下面是它的代码: 和例外: