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

Spring批处理并行Tasklet

东郭臻
2023-03-14

我目前正在构建一个spring批处理应用程序,其中执行了几个步骤。除了一个,所有的步骤都是简单的tasklet(没有读取器或写入器),它们负责各种任务,如复制文件、发送请求、启动批处理(*.bat)文件等。

大多数步骤应该是串行执行的。在一个特定的步骤中,我希望启动X*.bat文件,这些文件最多可以有Y个实例。

    null

如果1==true:)我想我必须使用taskExecutor,下面我有一个示例,在这里我开始第一步(假设必须找出X是多少),然后我有一个flowParallel(简单地说,如果有更多的批处理,请再次开始该步骤),然后我进行了一个拆分,以允许并行执行(目前只有3个步骤,当然我可以用一个限制“taskExecutor.setmaxpoolsize”的循环添加所有的X,我觉得这很愚蠢)

Flow flowInit = new  FlowBuilder<Flow>("flowInit")
            .from(stepS1)
            .end();


    Flow flowParallel = new  FlowBuilder<Flow>("flowParallel")
            .start(stepS1Parallel)
            .next(deciderOne)
            .on("thereAreMoreBatchesToExecute")
            .to(stepS1Parallel).end();


    final Flow splitFlow = new FlowBuilder<Flow>("splitFlow")
                    .start(flowParallel)
                    .split(new SimpleAsyncTaskExecutor())
                    .add(flowParallel, flowParallel, flowParallel)
                    .build();

    return jobs.get("dataLoadParallel")
            .start(flowInit)
            .next(splitFlow)
            .next(stepS1)
            .end().build();

那么,我做错了什么?我该走哪条路?

共有1个答案

郤仰岳
2023-03-14

如果希望tu设置最大并发量,则必须使用SimpleAsyncTaskExecutor的setConcurrencyLimit方法。

如果希望几个步骤并行运行,则需要为每个步骤实例化唯一的步骤和唯一的流。在上面的示例中,在流(flowParallel)的同一个实例中并行地启动一个步骤(stepS1Parallel)的同一个实例。这意味着,一个步骤的同一个实例是用多个线程调用的,这肯定会把事情搞砸。

因此,您需要有一个循环,在这个循环中,为您想要处理的每个*.bat文件创建一个步骤的实例和一个流的实例。

HTH

 类似资料:
  • 当我使用Spring批处理管理运行长时间运行的批处理作业的多个实例时,它会在达到jobLauncher线程池任务执行程序池大小后阻止其他作业运行。但是从cron中提取多个工作似乎效果不错。下面是作业启动器配置。 Spring批处理管理员Restful API是否使用不同于xml配置中指定的作业启动器?

  • 我有一个作业流,我希望以以下方式运行它: 作业流将从Job1开始。在Job1成功完成后,Job1将同时启动Job2和Job4。 Job2和Job4将并行运行。 在Job2成功完成后,Job2将启动Job3。 在Job4成功完成后,Job4将启动Job5。 下面是job1.xml和job1的作业启动器类的代码片段: job1.xml uijobLauncher.java “job2,Job3”对和“

  • 我是Spring批处理的新手,我只想问如何从多行结果集中检索数据。我有以下场景: > 有两个不同的表说员工 使用时,我只能创建一个工资单子级,但该表可能有多个子级。请帮助...

  • 我在我的项目中集成了Spring Batch,我在运行JobLauncher时遇到了问题。 在我的类JobLauncher我有这个: 对于配置,我使用XML配置: 配置批处理。xml: 在作业配置中。我有: 当我在类JobLauncher中调试时,它会在jobLuancher中停止。运行,我也不例外,似乎SpringBatch无法识别reader和whriter!!有什么建议吗?

  • 考虑一个阶跃豆: 要求:在Reader中,它从文件中读取(Entity1的)记录。在处理器中,它进行处理,在Writer中,它写入数据库。 在TaskExecutor之前,只创建了一个线程,它将在读取器和处理器中循环1000次,如上面的块设置中所定义的。然后它将移动到writer并写入所有1000条记录。它将再次从记录编号1001开始,然后在读取器和处理器中处理另外1000条记录。这是一个同步执行

  • 我在BatchScheduler中有多个计划作业,它在特定时间运行。简单的内置JobLauncher,这是同步的。在自然界中最初使用。现在,我想并行运行这些作业,这样没有作业可以等待其他作业完成。 我在不同的作业上尝试过@Async注释,但都不起作用。 然后,我尝试设置joblauncher.settaskexecutor(新的SimpleAsyncTaskExecutor())。但这并不奏效。