Browse Source
So far, one has to set the "fork" value to both the start and stop goals. Since they have the same name, sharing them in a global configuration element does the trick. However, the plugin also supports auto-detection of the fork value according to other parameters: typically if an agent or jvm arguments are set, forking will be automatically enabled. This is a problem since the stop goal is not aware of that. This commit transmits the value in a property attached to the `MavenProject`. That way, the stop goal can retrieve that value and apply the same defaults. This has the side effect that specifying the fork value isn't necessary anymore. Closes gh-6747pull/6855/head
7 changed files with 176 additions and 8 deletions
@ -0,0 +1 @@ |
|||||||
|
invoker.goals=clean verify |
||||||
@ -0,0 +1,58 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
||||||
|
<modelVersion>4.0.0</modelVersion> |
||||||
|
<groupId>org.springframework.boot.maven.it</groupId> |
||||||
|
<artifactId>start-stop-automatic-fork</artifactId> |
||||||
|
<version>0.0.1.BUILD-SNAPSHOT</version> |
||||||
|
<properties> |
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
||||||
|
</properties> |
||||||
|
<build> |
||||||
|
<plugins> |
||||||
|
<plugin> |
||||||
|
<groupId>org.codehaus.mojo</groupId> |
||||||
|
<artifactId>build-helper-maven-plugin</artifactId> |
||||||
|
<executions> |
||||||
|
<execution> |
||||||
|
<id>reserve-jmx-port</id> |
||||||
|
<goals> |
||||||
|
<goal>reserve-network-port</goal> |
||||||
|
</goals> |
||||||
|
<phase>process-resources</phase> |
||||||
|
<configuration> |
||||||
|
<portNames> |
||||||
|
<portName>jmx.port</portName> |
||||||
|
</portNames> |
||||||
|
</configuration> |
||||||
|
</execution> |
||||||
|
</executions> |
||||||
|
</plugin> |
||||||
|
<plugin> |
||||||
|
<groupId>@project.groupId@</groupId> |
||||||
|
<artifactId>@project.artifactId@</artifactId> |
||||||
|
<version>@project.version@</version> |
||||||
|
<executions> |
||||||
|
<execution> |
||||||
|
<id>pre-integration-test</id> |
||||||
|
<goals> |
||||||
|
<goal>start</goal> |
||||||
|
</goals> |
||||||
|
<configuration> |
||||||
|
<jvmArguments>-Dfoo=bar</jvmArguments> |
||||||
|
</configuration> |
||||||
|
</execution> |
||||||
|
<execution> |
||||||
|
<id>post-integration-test</id> |
||||||
|
<goals> |
||||||
|
<goal>stop</goal> |
||||||
|
</goals> |
||||||
|
</execution> |
||||||
|
</executions> |
||||||
|
<configuration> |
||||||
|
<jmxPort>${jmx.port}</jmxPort> |
||||||
|
</configuration> |
||||||
|
</plugin> |
||||||
|
</plugins> |
||||||
|
</build> |
||||||
|
</project> |
||||||
@ -0,0 +1,82 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2012-2016 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.test; |
||||||
|
|
||||||
|
import java.lang.management.ManagementFactory; |
||||||
|
|
||||||
|
import javax.management.MBeanServer; |
||||||
|
import javax.management.ObjectName; |
||||||
|
|
||||||
|
/** |
||||||
|
* This sample app simulates the JMX Mbean that is exposed by the Spring Boot application. |
||||||
|
*/ |
||||||
|
public class SampleApplication { |
||||||
|
|
||||||
|
private static final Object lock = new Object(); |
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception { |
||||||
|
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); |
||||||
|
ObjectName name = new ObjectName( |
||||||
|
"org.springframework.boot:type=Admin,name=SpringApplication"); |
||||||
|
SpringApplicationAdmin mbean = new SpringApplicationAdmin(); |
||||||
|
mbs.registerMBean(mbean, name); |
||||||
|
|
||||||
|
// Flag the app as ready
|
||||||
|
mbean.ready = true; |
||||||
|
|
||||||
|
int waitAttempts = 0; |
||||||
|
while (!mbean.shutdownInvoked) { |
||||||
|
if (waitAttempts > 30) { |
||||||
|
throw new IllegalStateException( |
||||||
|
"Shutdown should have been invoked by now"); |
||||||
|
} |
||||||
|
synchronized (lock) { |
||||||
|
lock.wait(250); |
||||||
|
} |
||||||
|
waitAttempts++; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public interface SpringApplicationAdminMXBean { |
||||||
|
|
||||||
|
boolean isReady(); |
||||||
|
|
||||||
|
void shutdown(); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
static class SpringApplicationAdmin implements SpringApplicationAdminMXBean { |
||||||
|
|
||||||
|
private boolean ready; |
||||||
|
|
||||||
|
private boolean shutdownInvoked; |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isReady() { |
||||||
|
System.out.println("isReady: " + this.ready); |
||||||
|
return this.ready; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void shutdown() { |
||||||
|
this.shutdownInvoked = true; |
||||||
|
System.out.println("Shutdown requested"); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,5 @@ |
|||||||
|
import static org.junit.Assert.assertTrue |
||||||
|
|
||||||
|
def file = new File(basedir, "build.log") |
||||||
|
assertTrue 'Start should have waited for application to be ready', file.text.contains("isReady: true") |
||||||
|
assertTrue 'Shutdown should have been invoked', file.text.contains("Shutdown requested") |
||||||
Loading…
Reference in new issue