[英]Spring Boot with spring-boot-maven plug-in - unable to RESTART the application server after running integration tests
I have a Spring Boot application and that application has integration tests.我有一个 Spring Boot 应用程序,并且该应用程序具有集成测试。
Here is the relevant snippet from my pom.xml for running the integration tests.这是我的 pom.xml 中用于运行集成测试的相关片段。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.xyz.Application</mainClass>
<executable>true</executable>
<fork>true</fork>
<jmxPort>7654</jmxPort>
</configuration>
<executions>
<execution>
<id>pre-integration-test</id>
<goals>
<goal>start</goal>
</goals>
<configuration>
<fork>true</fork>
<jmxPort>7654</jmxPort>
</configuration>
</execution>
<execution>
<id>post-integration-test</id>
<goals>
<goal>stop</goal>
</goals>
<configuration>
<fork>true</fork>
<jmxPort>7654</jmxPort>
</configuration>
</execution>
</executions>
</plugin>
When I run mvn verify
, I see the unit tests running first.当我运行
mvn verify
,我看到单元测试首先运行。 Then the application server starts and the integration tests run successfully.然后应用服务器启动,集成测试成功运行。 The mvn process exits with a success.
mvn 进程成功退出。
I also see the following in the console log which leads me to believe that the application server is being shutdown correctly -我还在控制台日志中看到以下内容,这让我相信应用程序服务器正在正确关闭 -
[INFO] --- spring-boot-maven-plugin:2.1.1.RELEASE:stop (post-integration-test) @ application ---
[DEBUG] Configuring mojo org.springframework.boot:spring-boot-maven-plugin:2.1.1.RELEASE:stop from plugin realm ClassRealm[plugin>org.springframework.boot:spring-boot-maven-plugin:2.1.1.RELEASE, parent: sun.misc.Launcher$AppClassLoader@42a57993]
[DEBUG] Configuring mojo 'org.springframework.boot:spring-boot-maven-plugin:2.1.1.RELEASE:stop' with basic configurator -->
[DEBUG] (f) fork = true
[DEBUG] (f) jmxPort = 7654
[DEBUG] (f) project = MavenProject: com.xyz:application:1.0-SNAPSHOT @ /Users/me/code/my-project/pom.xml
[DEBUG] (f) skip = false
[DEBUG] -- end configuration --
[INFO] Stopping application...
2019-01-07 14:18:18.375 INFO [-,,,] 38653 --- [on(4)-127.0.0.1] inMXBeanRegistrar$SpringApplicationAdmin : Application shutdown requested.
2019-01-07 14:18:18.375 INFO [-,,,] 38653 --- [on(4)-127.0.0.1] ConfigServletWebServerApplicationContext : Closing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@449465bf: startup date [Mon Jan 07 14:17:22 EST 2019]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@475a6eb6
2019-01-07 14:18:18.376 INFO [-,,,] 38653 --- [on(4)-127.0.0.1] ConfigServletWebServerApplicationContext : Closing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@4cf0901e: startup date [Mon Jan 07 14:17:30 EST 2019]; parent: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@449465bf
2019-01-07 14:18:18.385 INFO [-,,,] 38653 --- [on(4)-127.0.0.1] o.e.jetty.server.AbstractConnector : Stopped ServerConnector@e45db77{HTTP/1.1,[http/1.1]}{0.0.0.0:8081}
2019-01-07 14:18:18.385 INFO [-,,,] 38653 --- [on(4)-127.0.0.1] org.eclipse.jetty.server.session : node0 Stopped scavenging
2019-01-07 14:18:18.387 INFO [-,,,] 38653 --- [on(4)-127.0.0.1] o.e.j.s.h.ContextHandler.application : Destroying Spring FrameworkServlet 'dispatcherServlet'
2019-01-07 14:18:18.388 INFO [-,,,] 38653 --- [on(4)-127.0.0.1] o.e.jetty.server.handler.ContextHandler : Stopped o.s.b.w.e.j.JettyEmbeddedWebAppContext@16b7a081{application,/,[file:///private/var/folders/sc/d2x30b2j6jj5hpvfkqx9p31n5jmbmc/T/jetty-docbase.6078950105283659171.8081/, jar:file:/Users/me/.m2/repository/io/springfox/springfox-swagger-ui/2.9.2/springfox-swagger-ui-2.9.2.jar!/META-INF/resources],UNAVAILABLE}
2019-01-07 14:18:18.390 INFO [-,,,] 38653 --- [on(4)-127.0.0.1] o.s.c.support.DefaultLifecycleProcessor : Stopping beans in phase 2147483647
2019-01-07 14:18:18.393 INFO [-,,,] 38653 --- [on(4)-127.0.0.1] o.s.j.e.a.AnnotationMBeanExporter : Unregistering JMX-exposed beans on shutdown
2019-01-07 14:18:18.393 INFO [-,,,] 38653 --- [on(4)-127.0.0.1] o.s.j.e.a.AnnotationMBeanExporter : Unregistering JMX-exposed beans
2019-01-07 14:18:18.403 INFO [-,,,] 38653 --- [on(4)-127.0.0.1] s.c.a.AnnotationConfigApplicationContext : Closing FeignContext-cse-service: startup date [Mon Jan 07 14:17:27 EST 2019]; parent: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@449465bf
...
2019-01-07 14:18:18.472 WARN [-,,,] 38653 --- [pool-1-thread-5] c.n.c.sources.URLConfigurationSource : No URLs will be polled as dynamic configuration sources.
2019-01-07 14:18:18.472 INFO [-,,,] 38653 --- [pool-1-thread-5] c.n.c.sources.URLConfigurationSource : To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.
2019-01-07 14:18:18.473 INFO [-,,,] 38653 --- [pool-1-thread-5] c.netflix.config.DynamicPropertyFactory : DynamicPropertyFactory is initialized with configuration sources: com.netflix.config.ConcurrentCompositeConfiguration@139bf1b8
...
2019-01-07 14:18:18.628 INFO [-,,,] 38653 --- [on(4)-127.0.0.1] o.e.jetty.server.AbstractConnector : Stopped ServerConnector@678b05be{HTTP/1.1,[http/1.1]}{0.0.0.0:8080}
2019-01-07 14:18:18.628 INFO [-,,,] 38653 --- [on(4)-127.0.0.1] org.eclipse.jetty.server.session : node0 Stopped scavenging
2019-01-07 14:18:18.629 INFO [-,,,] 38653 --- [on(4)-127.0.0.1] o.e.j.s.h.ContextHandler.application : Destroying Spring FrameworkServlet 'dispatcherServlet'
2019-01-07 14:18:18.629 INFO [-,,,] 38653 --- [on(4)-127.0.0.1] o.e.jetty.server.handler.ContextHandler : Stopped o.s.b.w.e.j.JettyEmbeddedWebAppContext@4808c18e{application,/api/v1,[file:///private/var/folders/sc/d2x30b2j6jj5hpvfkqx9p31n5jmbmc/T/jetty-docbase.6019952027552218513.8080/, jar:file:/Users/me/.m2/repository/io/springfox/springfox-swagger-ui/2.9.2/springfox-swagger-ui-2.9.2.jar!/META-INF/resources],UNAVAILABLE}
Subsequently, when I run mvn verify
again, I get the following bind exception.随后,当我再次运行
mvn verify
时,我收到以下绑定异常。
[DEBUG] Application argument(s):
[DEBUG] Connecting to local MBeanServer at port 7654
[DEBUG] Waiting for spring application to start...
[DEBUG] Connected to local MBeanServer at port 7654
[DEBUG] Waiting for spring application to start...
[DEBUG] Spring application is not ready yet, waiting 500ms (attempt 1)
Error: Exception thrown by the agent : java.rmi.server.ExportException: Port already in use: 7654; nested exception is:
java.net.BindException: Address already in use (Bind failed)
Using netstat
and ps
I am able to ascertain that there is some process that is still holding on to port 7654, and jps
tells me that it is this process -使用
netstat
和ps
我能够确定有一些进程仍在保持端口 7654,并且jps
告诉我这是这个进程 -
47148 Application -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=7654 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1
I don't know how to get the JMX process to shutdown.我不知道如何让 JMX 进程关闭。 I assumed that the
spring-boot-maven
plug-in would do that.我认为
spring-boot-maven
插件会做到这一点。 And that does not seem to be the case.而事实似乎并非如此。
What am I doing wrong and can someone please help?我做错了什么,有人可以帮忙吗? Really appreciate you taking time to look at this (potential) problem.
非常感谢您花时间研究这个(潜在的)问题。
I was facing the same issue, not being able to rerun tests before killing the JMX process.我遇到了同样的问题,在杀死 JMX 进程之前无法重新运行测试。 Next to that, my Azure DevOps pipeline was hanging because of the JMX process not being stopped.
接下来,我的 Azure DevOps 管道由于 JMX 进程没有停止而挂起。
The STDIO streams did not close within 10 seconds of the exit event from process '/usr/share/apache-maven-3.6.3/bin/mvn'. This may indicate a child process inherited the STDIO streams and has not yet exited.
When I browsed through the source code: https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/StartMojo.java#L128 , I discovered that the JMX agent would not be booted if I did not fork the maven process.当我浏览源代码时: https : //github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/ main/java/org/springframework/boot/maven/StartMojo.java#L128 ,我发现如果我不 fork maven 进程,JMX 代理将无法启动。
I'm not sure this is applicable for you, but I did not require forking per se, and also did not need JMX metrics, so this fixed it for me:我不确定这是否适用于您,但我本身不需要分叉,也不需要 JMX 指标,所以这为我修复了它:
<configuration>
<fork>false</fork>
</configuration>
I also tried to override the jmx arguments (-Dcom.sun.management.jmxremote), by specifying them in the plugin configuration, but since the arguments are added (hardcoded) as the final arguments, that was not working for me.我还尝试通过在插件配置中指定它们来覆盖 jmx 参数(-Dcom.sun.management.jmxremote),但由于这些参数被添加(硬编码)为最终参数,这对我不起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.