当前位置: 首页 > 知识库问答 >
问题:

Spring批处理延迟步骤初始化

裴畅
2023-03-14

我有一个Spring批处理工作,分两步。第一个下载文件,第二个处理文件。问题是,在第一步运行之前,第二步不知道文件的名称。

作业已自动实例化这些步骤,以便在需要时运行。我想不出任何方法来确保第一步运行后该步骤会初始化。

以下是代码:

    @Bean
public Job insertIntoDbFromCsvb(){
    return jobs.get("Insert Entity Records Job")
            .incrementer(new RunIdIncrementer())
             .listener(new InsertRecordListener())
            .start(downloadFileStep())
            .next(insertIntoDBStep())
            .build();
}

@Bean
ItemProcessor<Entity, Entity> csvEntityProcessor() {
    return new EntityItemProcessor();
}

@Bean
public Step insertIntoDBStep(){
    return steps.get("Insert Entity Records Step")
            .<Entity, Entity>chunk(500)
            .reader(csvFileReader())
            .processor(csvEntityProcessor())
            .writer(itemWriter())
            .build();
}

@Bean
public Step downloadFileStep(){
    return steps.get("Download File Step")
            .tasklet(new DownloadFileTasklet("https://leidata-preview.gleif.org/storage/golden-copy-files/2018/06/14/49694/20180614-0000-gleif-goldencopy-lei2-golden-copy.csv.zip",
                    fileDao,
                    FileAction.INIT_ENTITY,
                    this))
            .allowStartIfComplete(true)
            .build();
}

@Bean
public FlatFileItemReader<Entity> csvFileReader(){
    System.out.println("file name: " + fileName);
    FlatFileItemReader<Entity> reader = new FlatFileItemReader<>();
    reader.setResource(new ClassPathResource("data/"+this.fileName));
    reader.setStrict(false);
    reader.setLinesToSkip(1);
    reader.setLineMapper(lineMapper());

    return reader;
}

你可以看到阅读器。setResource(新类路径资源(“data/”this.fileName))获取我在第一步的Tasklet中设置的局部变量fileName

共有1个答案

秦博达
2023-03-14

后期绑定由Spring批处理,您必须将bean的范围设置为step

使用XML:

<bean id="myReader" scope="step"...>

使用Java(在bean声明中设置注释):

@StepScope

文档:https://docs.spring.io/spring-batch/trunk/reference/html/configureStep.html#step-scope

 类似资料:
  • 如何在Vertx中处理延迟作业列表(实际上是数百个HTTP GET请求,到禁止快速请求主机的有限API)?现在,我正在使用此代码,它被阻止,因为Vertx一次启动所有请求。希望在每个请求之间有5秒的延迟来处理每个请求。

  • 我正在尝试修复Spring Batch中的一个问题,这个问题最近一直困扰着我们的系统。我们有一份工作,在大多数情况下都很好。下载和处理数据是一个多步骤的工作。 问题是有时工作会爆棚。也许我们试图连接到的服务器抛出了错误,或者我们在工作进行到一半时关闭了服务器。此时,下次我们的quartz调度程序尝试运行该作业时,它似乎什么也不做。以下是此作业定义的删节版本: 委婉地说,我是Spring Batch

  • 以下是一些背景代码: InitiativeProfileQuestion。java: ProfileAnswer.java: InitiativeProfileQuestionRepository。java: InitiativeProfileService。java: 基础ontroller.java: 在我的BaseController中调用get问题()会返回“无法初始化代理-没有会话”错误

  • 我正在开发一个Spring-MVC应用程序,其中我有3个类,组扫描,组节,组注释。组扫描器具有与组节的一对多映射,组节与组注释具有一对多映射。我正在尝试根据 GroupCanvas 的主键检索注释,但我收到Hibernate延迟初始化异常。我在网上尝试了这些建议,主要是SO,但似乎没有帮助。这是代码。 DAO 方法抛出错误: GroupCanvas模型: 组段模型类: 群注释: 错误日志: 我做错

  • 我正在寻找一些关于测试Spring批处理步骤和步骤执行的一般性意见和建议。 我的基本步骤是从api读入数据,处理实体对象,然后写入数据库。我已经测试了快乐之路,这一步成功地完成了。我现在想做的是在处理器阶段数据丢失时测试异常处理。我可以单独测试processor类,但我更愿意测试整个步骤,以确保在步骤/作业级别正确反映流程故障。 我已经阅读了spring批量测试指南,如果我是诚实的,我对它有点迷茫

  • 我正在尝试在Spring批处理中并行运行多个作业。在谷歌上搜索了很多之后,我遇到了JobStep。有没有人使用过JobStep可以解释如何使用它来并行运行作业,或者有没有其他方法可以并行运行2个独立的作业,即当我启动批处理时,2个作业应该开始并行运行。我的要求就像 当我的应用程序启动时,两个作业都应该开始运行。使用spring batch是否可以这样做 编辑:我甚至试过这种方法 我面临着例外。sp