如何像Rake任务一样为Spring Boot应用程序执行命令行任务?

时间:2019-01-24 01:51:13

标签: java spring spring-boot

在Spring Boot中,如何从命令行运行诸如Jenkins的报告之类的长期运行任务?我正在寻找类似于Ruby on Rails Rake任务的内容。 Rake任务在与Web服务器相同的应用程序上下文中从命令行执行代码,以便您可以重复使用代码。

  • 我找到了Spring Batch,但听起来更像Resque
  • 我发现了command line runners,但是它说它们都在Web服务器启动之前运行,所以我不能运行它或只运​​行一个任务。
  • 我发现scheduled tasks听起来很完美,但是我的应用负载均衡,因此很多实例都无法运行,

我有一个报告,查询需要30多个秒才能运行,并生成一个我想邮寄的CSV文件。我希望它与cron或Jenkins一起每周自动运行。

2 个答案:

答案 0 :(得分:0)

最近我遇到了类似的问题,我想出了以下三种可能的解决方案:

  1. 指定“管家”角色,最多由一个实例来担任,其职责是完成计划的工作。但是为此,管家将不得不(通过负载均衡器..)向其他人发送心跳信号,如果停止,则其余实例必须选择一个新实例,因此这似乎是一种有趣但更复杂的方法以后再玩。
  2. 具有单实例外部服务,该服务将运行计划的任务并为您生成每周的csv
  3. 具有单实例外部服务,该服务仅具有进行计划的api调用的能力,并且可以通过负载平衡器调用原始服务。我更喜欢这种解决方案,因为完成任务的所有资源都已存在于原始服务中,并且保留了功能。它也很灵活,因为调度程序服务可以通过curl调用替换为更轻量级的cron作业,或者在将来合并到另一个服务中。

答案 1 :(得分:0)

我破解了一个解决方案。欢迎提出建议。

package com.example.tasks;

@Component
public class WeeklyReport implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        Arrays.asList(args).stream().forEach(a -> System.out.println(a));
        if (!(args.length > 0 && args[0].equals("-task report:weekly"))) return;
        System.out.println("weekly report");
        System.exit(0);
    }

并通过“ cron”作业运行它

$ mvn spring-boot:run -Drun.arguments="-task report:weekly"

https://docs.spring.io/spring-boot/docs/1.5.19.RELEASE/reference/htmlsingle/#boot-features-command-line-runner

https://www.baeldung.com/spring-boot-command-line-arguments

https://therealdanvega.com/blog/2017/04/07/spring-boot-command-line-runner