我有一个打包为WAR文件的Spring Boot Web应用程序,我希望能够按需运行一些任务(脚本或命令)。例如:
如果这些“命令”可以访问与Web应用程序相同的相同的bean(服务,DAO)和模型,则将更容易实现。我希望我必须在某个地方创建一个Spring应用程序上下文来实现。我还希望将这些命令与应用程序的其余部分打包在一起,以便与它们一起进行测试并易于部署。
本质上,我想知道如何实现与Laravel的工匠命令(PHP)类似的功能。
我已经读过在这里和这里在WAR中运行类的信息。我正在搜索打包和运行命令的“Spring之路”。为此,我是否需要集成Spring Batch作业?据我了解,Spring Batch是用于较大的工作负载的,可以分为多个批次。我应该咬一下子弹,然后将命令放在引用第一个模块的另一个Maven模块中吗?
我实现了一个ApplicationRunner(感谢Stefan!),以查看它们的工作方式,并发现它们在刷新Spring应用程序上下文之后运行。这意味着在运行程序执行之前,整个Web应用程序已初始化并处于活动状态。这包括MVC终结点映射程序和配置中定义的计划任务。尽管这绝对有用,但是我需要在所有不活动的情况下运行命令,因为它可能与命令冲突(尤其是在命令运行期间出现瞬态数据状态)。
ApplicationRunner
我只需要创建另一个可执行jar,即可使用来创建Spring Boot应用程序CommandLineRunner。如果使用3个模块,则可以引用Web应用程序中的所有bean:
CommandLineRunner
您可以使用ApplicationRunner参阅spring boot应用程序亚军。在应用程序启动后,将执行运行程序,并且您可以访问spring上下文。
该CommandLineRunner班正是用于此目的。