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

如何按一定顺序运行Spring批处理作业(Spring Boot)?

鱼安然
2023-03-14

我正在用Spring Batch开发使用Spring Boot。

我使用了Spring Boot提供的最小配置,并定义了一些作业(根本没有XML配置)。但当我运行应用程序时,

SpringApplication.run(App.class, args);

作业按任意顺序依次执行。

我在@configuration注释类中以这种方式定义作业,其余的由Spring完成:

@Bean
public Job requestTickets() {
    return jobBuilderFactory.get(Config.JOB_REQUEST_TICKETS)
            .start(stepRequestTickets())
            .build();
}

编辑:这个警告能给出一个提示吗?(也许没什么可做的)

2016-12-29 17:45:33.320  WARN 3528 --- [main] o.s.b.c.c.a.DefaultBatchConfigurer: No datasource was provided...using a Map based JobRepository

共有1个答案

何浩荡
2023-03-14

1.首先通过在Application.Properties中指定spring.batch.job.enabled=false来禁用自动作业启动

2.在主类中,do-applicationcontext ctx=springapplication.run(SpringBatchMain.class,args);,假设主类名为-springBatchMain.java。

这将在不启动任何作业的情况下初始化上下文。

3.初始化上下文后,您可以执行-joblauncherjoblauncher=(jobLauncher)ctx.getBean(“jobLauncher”);或在main类中为这个jobLauncher bean执行autowired并通过调用,jobLauncher.run(job,jobParameters)按特定顺序依次启动特定作业。

您可以从步骤2初始化的上下文中获取特定的job实例。

始终可以使用任何有序集合将作业放在那里,并通过迭代该集合启动作业。

4.只要将JobLauncher配置为同步,上述技术就可以工作,即主线程等待JobLauncher.run()调用完成,这是JobLauncher的默认行为。

如果您已经将jobLauncher定义为使用AsyncTaskExecutor,那么作业将并行启动,并且不会保持顺序排序。

希望有帮助!!

编辑:

正如Stephane Nicoll所指出的,我正在试验@order注释,它似乎只有助于创建有序的作业集合,并且您可以按照该顺序迭代和启动作业。

@Component
public class MyJobs {
    @Autowired
    private List<Job> jobs;

    public List<Job> getJobs() {
        return jobs;
    }
}
@Bean
    public MyJobs myJobs() {
        return new MyJobs();
    }
 类似资料:
  • 问题内容: 运行main方法时,将执行作业。这样我无法弄清楚如何控制作业的执行。例如,您如何安排作业,访问作业执行或设置作业参数的方式。 我试图注册自己的JobLauncher 但是当我尝试在主要方法中使用它时: 当加载上下文时,该作业再次执行,而当我尝试手动运行它时,我得到了。有没有办法防止自动作业执行? 问题答案: 通过设置可以防止作业执行 在application.properties中。或

  • 我按照这个示例使用Boot进行Spring批处理。 运行main方法时,作业将执行。这样我就不知道如何控制作业的执行了。例如如何排定作业、访问作业执行或设置作业参数。 我尝试注册自己的JobLauncher 但当我尝试在主法中使用时: 当加载上下文时,再次执行作业,并且尝试手动运行作业时得到。有没有办法防止自动执行作业?

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

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

  • 我正在使用spring批处理读取CSV文件并使用controller触发器将其写入DB。在启动应用程序时,在我从浏览器url中点击之前,我会在启动时看到来自阅读器的打印语句。虽然它不为我的处理器或写入器打印它,它们是在单独的类中,我已经自动连线。是因为读者是豆子吗?

  • 到目前为止,我正在运行spring批处理,只有一个作业。现在我想运行多个不同的作业,这意味着不同的功能。在我的配置文件中,我配置了两个具有不同id和不同名称的作业。现在我得负责这些工作。你能告诉我怎么跑吗。在这里,我的疑问是在我的java类中,我已经为运行批处理编写了这段代码。 对于其他作业,如何调用jobLauncher的run方法。 我的配置文件是