Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为Spring引导应用程序执行命令行任务,比如Rake任务?_Java_Spring_Spring Boot - Fatal编程技术网

Java 如何为Spring引导应用程序执行命令行任务,比如Rake任务?

Java 如何为Spring引导应用程序执行命令行任务,比如Rake任务?,java,spring,spring-boot,Java,Spring,Spring Boot,如何从命令行为长时间运行的作业(如SpringBoot中Jenkins的报告)运行任务?我正在寻找类似RubyonRails的Rake任务。Rake任务在与web服务器相同的应用程序上下文中从命令行执行代码,以便您可以重用代码 我发现了,但听起来更像 我发现,但它说它们都在web服务器启动之前运行,所以我不能运行它或只运行一个任务 我发现这听起来很完美,但我的应用程序负载均衡,有很多实例,所以我不希望它一次运行多次 我有一个报告,其中查询需要30多秒才能运行,并生成一个CSV文件,我想通过邮

如何从命令行为长时间运行的作业(如SpringBoot中Jenkins的报告)运行任务?我正在寻找类似RubyonRails的Rake任务。Rake任务在与web服务器相同的应用程序上下文中从命令行执行代码,以便您可以重用代码

  • 我发现了,但听起来更像
  • 我发现,但它说它们都在web服务器启动之前运行,所以我不能运行它或只运行一个任务
  • 我发现这听起来很完美,但我的应用程序负载均衡,有很多实例,所以我不希望它一次运行多次

我有一个报告,其中查询需要30多秒才能运行,并生成一个CSV文件,我想通过邮件发送。我希望它每周自动运行与克朗或詹金斯

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

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

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

    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"
    

    2)如果没有其他实例使用相同的代码运行计划任务,单个实例如何运行计划任务?3) 报告所用时间超出负载平衡器允许的时间。HTTP请求限制为10秒,报告大约需要一分钟。它在管理界面中已经有一个链接,用于生成报告,该报告在开发过程中有效,但在生产过程中超时。2)如果可以,您需要将原始服务的这一部分重构为新的服务,就像它只使用数据库而不需要服务的其余部分一样。或者将其复制到新服务(听起来很糟糕,我不同意)3)由于所有内容都保留在原始服务中,您只需将接受的消息发送回调度程序服务,并继续处理主服务中的所有其他内容。调度器不需要知道可能的故障,因为它可以在主服务中处理(通知、日志记录、失效等)