如何在分叉进程上使用 gradle 任务启动 Spring Boot 应用程序?

Posted

技术标签:

【中文标题】如何在分叉进程上使用 gradle 任务启动 Spring Boot 应用程序?【英文标题】:How to start spring boot application with a gradle task on a forked process? 【发布时间】:2020-03-09 14:46:37 【问题描述】:

我有一个带有虚拟端点的 Spring Boot 应用程序,我想在该端点上执行加特林负载测试。

毕业任务:

task testLoad(type: JavaExec) 
    description = 'Test load the Spring Boot web service with Gatling'
    group = 'Load Test'
    classpath = sourceSets.test.runtimeClasspath
    jvmArgs = [
            "-Dgatling.core.directory.binaries=$sourceSets.test.output.classesDir.toString()",
            "-Dlogback.configurationFile=$logbackGatlingConfig()"
    ]
    main = 'io.gatling.app.Gatling'
    args = [
            '--simulation', 'webservice.gatling.simulation.WebServiceCallSimulation',
            '--results-folder', "$buildDir/gatling-results",
            '--binaries-folder', sourceSets.test.output.classesDir.toString()
    ]

虚拟休息端点:

@RestController
public class GreetingController 
    @RequestMapping("/greeting")
    public Greeting greeting() 
        return new Greeting("Hello, World");
    

我想在 gradle 中创建另一个任务来启动 Spring Boot 应用程序。

testLoad.dependsOn startSpringBoot

所以,问题是我不知道如何在 gradle 任务中启动 spring boot 应用程序:

task startSpringBoot(type: JavaExec) 
    // somehow start main = 'webservice.Application'

然后用另一个任务关闭spring boot应用:

testLoad.finalizedBy stopSpringBoot


task stopSpringBoot(type: JavaExec) 
    // somehow stop main = 'webservice.Application'

【问题讨论】:

【参考方案1】:

我发现一个教程确实向您展示了如何做到这一点: http://brokenrhythm.blog/gradle-gatling-springboot-automation#Gradle

classpath 'com.github.jengelman.gradle.plugins:gradle-processes:0.3.0'
apply plugin: 'com.github.johnrengelman.processes'

此插件为您提供对任务执行的分叉进程的支持。

task startSpringBoot(type: JavaFork) 
    description = 'Start Spring Boot in the background.'
    group = 'Load Test'
    classpath = sourceSets.main.runtimeClasspath
    main = 'webservice.Application'   

但最后我选择了不同的方法,不部署spring boot应用程序,但仍然调用java代码来做我的事情。

【讨论】:

【参考方案2】:

由于您使用的是 Gradle,因此您可以使用 GradleBuild 任务而不是 JavaExec 任务,如下所示:

task startSpringBoot(type: GradleBuild) 
  tasks = ['bootRun']

【讨论】:

不幸的是第二个任务,它在 start 之后执行SpringBoot 没有启动,因为第一个没有结束。所以任务执行挂在startSpringBoot。我认为我们需要分叉流程。我会检查是否有并行执行的好任务。

以上是关于如何在分叉进程上使用 gradle 任务启动 Spring Boot 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Gradle 测试任务在我的 JUnit 上启用调试

如何从Gradle构建中设置环境变量?

Gradle命令行操作

如何减少分叉进程以运行可执行文件的 Web 服务器的内存使用量?

如何以可编程方式等待进程启动端点

分叉和传递套接字c ++