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

spring批处理:如何动态创建步骤和任务

慕容典
2023-03-14

我是Spring新手,也是Spring批新手——所以,请耐心等待。

我知道spring batch是帮助运行步骤和任务的框架。

我尝试通过创建步骤和任务来使用spring批处理,但这些步骤和任务是在程序构建/编译时硬编码的。然而,我不知道如何动态创建任务和步骤。

我想做的是让用户创建一个脚本,说明如何从步骤列表中组装任务。每个步骤都将调用对现有RESTendpoint的远程调用。一项任务将包含多个这样的步骤。用户将创建多个这样的任务。

是否可以通过这样的步骤动态创建这样的任务?如果是,您能否向我指出一些示例代码如何使用所需的API执行此操作?

更新:

我知道HelloWorld作业使用callRestApplication()调用REST应用程序的情况如下所示。

@SpringBootApplication
@EnableBatchProcessing
public class HelloApplication {

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Bean
    public Step step() {
        return this.stepBuilderFactory.get("step1")
                .tasklet((stepContribution, chunkContext) -> {
                    callRestApplication();
                    return RepeatStatus.FINISHED;
                }).build();
    }

    @Bean
    public Job job() {
        return this.jobBuilderFactory.get("HelloWorldJob")
                .start(step())
                .build();
    }

    public static void main(String[] args) {
        SpringApplication.run(HelloApplication.class, args);
    }
}

然而,这是静态的。我在寻找一种方法,我可以做这样的事情

    public static void main(String[] args) {
        SpringApplication.run(HelloagainApplication.class, args);
        List<JobDefinition> jobDefinitions = parseScript();
        for (JobDefinition jobDefinition : jobDefinitions) {
            Job job = new Job();
            job.setName(jobDefinition.getName());
            for (StepDefinition stepDefinition : jobDefinition.getStepDefinitions()) {

                Step step = new Step();
                step.setEndPoint(stepDefinition.getEndPoint());
                step.setName(stepDefinition.getName());
                step.setProperty1(stepDefinition.getProp1());
                job.addStep(step);
            }
            job.startJob();
        }
    }

如果脚本有10个作业定义,那么将启动10个作业,每个作业包含x个步骤。

在spring batch中,我如何执行以下操作

  1. 工作。添加步骤(步骤)
  2. 工作。startJob()

谢谢

共有1个答案

蒙洛华
2023-03-14

Spring Batch中没有这样的功能。您需要编写自定义代码来解析用户的脚本,并相应地创建作业/步骤定义。

也就是说,Spring云数据流可能会帮助您。您可以预先定义任务,让用户使用GUI或基于文本的可编写脚本的DSL编写任务。您可能会感兴趣的另一个特性是Spring Cloud任务的单步作业启动程序,它允许您通过提供一些属性(无需编码)来动态创建单步作业。

 类似资料:
  • 添加工作到批处理作业 在“常规”选项卡的底部窗格中,选择工作类型,然后如有需要浏览连接、数据库和/或模式以找出你想运行的工作。 你可以双击或拖放工作来将工作从“可用的工作”列表移动到“已选择的工作”列表。若要从已选择的工作列表删除工作,请以相同的方式移除它们。你可以在一个批处理作业中运行来自不同服务器的配置文件。 若要重新排序工作的序列,可使用 “上移”或 “下移”按钮。 如果你想备份整个服务器,

  • 添加工作到批处理作业 在“常规”选项卡的底部窗格中,选择工作类型,然后如有需要浏览连接、数据库和/或模式以找出你想运行的工作。 你可以点击 或 来将已选择的工作或所有工作从“可用的工作”列表移动到“已选择的工作”列表。若要从已选择的工作列表删除已选择工作或所有工作,请点击 或 。你可以在一个批处理作业中运行来自不同服务器的配置文件。 若要重新排序工作的序列,可在已选择的工作列表中拖拉工作到所需的位

  • 添加工作到批处理作业 在“常规”选项卡的底部窗格中,选择工作类型,然后如有需要浏览连接、数据库和/或模式以找出你想运行的工作。 你可以双击或拖放工作来将工作从“可用的工作”列表移动到“已选择的工作”列表。若要从已选择的工作列表删除工作,请以相同的方式移除它们。你可以在一个批处理作业中运行来自不同服务器的配置文件。 若要重新排序工作的序列,可使用 “上移”或 “下移”按钮。 如果你想备份整个服务器,

  • 我需要多次调用webservice并传递使用来自多个表的数据创建的数据 UI->控制器->服务->(获取数据(表1,表2)并运行一些验证)1。如果验证失败-返回错误消息并停止。2.如果验证通过-调用JobLauncher并返回“任务启动”消息。 在异步作业中,我想到遵循2个步骤。 > bulkinsertstep > 我需要调用DB查询2个更多的表(Table3、table4)并创建一个大的数据集

  • 我目前正在处理一批数据,这些数据来自一个拥有数百万行的大型SQL数据库。 它在处理器中执行一些处理,包括通过带有连接的大型sql查询对从Reader检索到的行进行分组。 编写器将结果写入另一个表。 问题是此Batch存在性能问题,因为Sql选择查询需要大量时间并且步骤不会在多线程中执行。 因此,我希望在多标题中运行它们,但问题是,这些步骤通过计算具有相同类型的所有行的总数来对行进行分组。 因此,如

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