Commit 872f30e5 authored by Phillip Webb's avatar Phillip Webb

Merge branch '1.1.x'

Conflicts:
	spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/repository/redis/RedisMetricRepository.java
parents 73b80dbe 9dfbc25e
...@@ -58,7 +58,7 @@ public class RedisMetricRepository implements MetricRepository { ...@@ -58,7 +58,7 @@ public class RedisMetricRepository implements MetricRepository {
* Create a RedisMetricRepository with a default prefix to apply to all metric names. * Create a RedisMetricRepository with a default prefix to apply to all metric names.
* If multiple repositories share a redis instance they will feed into the same global * If multiple repositories share a redis instance they will feed into the same global
* metrics. * metrics.
* *
* @param redisConnectionFactory the redis connection factory * @param redisConnectionFactory the redis connection factory
*/ */
public RedisMetricRepository(RedisConnectionFactory redisConnectionFactory) { public RedisMetricRepository(RedisConnectionFactory redisConnectionFactory) {
...@@ -70,7 +70,7 @@ public class RedisMetricRepository implements MetricRepository { ...@@ -70,7 +70,7 @@ public class RedisMetricRepository implements MetricRepository {
* unique to this repository or to a logical repository contributed to by multiple * unique to this repository or to a logical repository contributed to by multiple
* instances, where they all see the same values). Recommended constructor for general * instances, where they all see the same values). Recommended constructor for general
* purpose use. * purpose use.
* *
* @param redisConnectionFactory the redis connection factory * @param redisConnectionFactory the redis connection factory
* @param prefix the prefix to set for all metrics keys * @param prefix the prefix to set for all metrics keys
*/ */
...@@ -84,7 +84,7 @@ public class RedisMetricRepository implements MetricRepository { ...@@ -84,7 +84,7 @@ public class RedisMetricRepository implements MetricRepository {
* redis store will hold a zset under the key just so the metric names can be * redis store will hold a zset under the key just so the metric names can be
* enumerated. Read operations, especially {@link #findAll()} and {@link #count()}, * enumerated. Read operations, especially {@link #findAll()} and {@link #count()},
* will only be accurate if the key is unique to the prefix of this repository. * will only be accurate if the key is unique to the prefix of this repository.
* *
* @param redisConnectionFactory the redis connection factory * @param redisConnectionFactory the redis connection factory
* @param prefix the prefix to set for all metrics keys * @param prefix the prefix to set for all metrics keys
* @param key the key to set * @param key the key to set
......
...@@ -26,13 +26,12 @@ import org.springframework.boot.context.event.ApplicationStartedEvent; ...@@ -26,13 +26,12 @@ import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.context.ApplicationListener; import org.springframework.context.ApplicationListener;
import org.springframework.core.Ordered; import org.springframework.core.Ordered;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.SystemPropertyUtils;
/** /**
* An {@link org.springframework.context.ApplicationListener} that saves application PID * An {@link org.springframework.context.ApplicationListener} that saves application PID
* into file. This application listener will be triggered exactly once per JVM, and the file * into file. This application listener will be triggered exactly once per JVM, and the
* name can be overridden at runtime with a System property or environment variable named * file name can be overridden at runtime with a System property or environment variable
* "PIDFILE" (or "pidfile"). * named "PIDFILE" (or "pidfile").
* *
* @author Jakub Kubrynski * @author Jakub Kubrynski
* @author Dave Syer * @author Dave Syer
...@@ -46,6 +45,8 @@ public class ApplicationPidListener implements ...@@ -46,6 +45,8 @@ public class ApplicationPidListener implements
private static final String DEFAULT_FILE_NAME = "application.pid"; private static final String DEFAULT_FILE_NAME = "application.pid";
private static final String[] PROPERTY_VARIABLES = { "PIDFILE", "pidfile" };
private static final AtomicBoolean created = new AtomicBoolean(false); private static final AtomicBoolean created = new AtomicBoolean(false);
private int order = Ordered.HIGHEST_PRECEDENCE + 13; private int order = Ordered.HIGHEST_PRECEDENCE + 13;
...@@ -74,10 +75,30 @@ public class ApplicationPidListener implements ...@@ -74,10 +75,30 @@ public class ApplicationPidListener implements
*/ */
public ApplicationPidListener(File file) { public ApplicationPidListener(File file) {
Assert.notNull(file, "File must not be null"); Assert.notNull(file, "File must not be null");
String actual = SystemPropertyUtils.resolvePlaceholders("${PIDFILE}", true); String override = getOverride();
actual = !actual.contains("$") ? actual : SystemPropertyUtils.resolvePlaceholders("${pidfile}", true); if (override != null) {
actual = !actual.contains("$") ? actual : file.getAbsolutePath(); this.file = new File(override);
this.file = new File(actual); }
else {
this.file = file;
}
}
private String getOverride() {
for (String property : PROPERTY_VARIABLES) {
try {
String override = System.getProperty(property);
override = (override != null ? override : System.getenv(property));
if (override != null) {
return override;
}
}
catch (Throwable ex) {
System.err.println("Could not resolve '" + property
+ "' as system property: " + ex);
}
}
return null;
} }
@Override @Override
......
...@@ -67,7 +67,9 @@ public class ApplicationPidListenerTests { ...@@ -67,7 +67,9 @@ public class ApplicationPidListenerTests {
System.setProperty("PIDFILE", this.temporaryFolder.newFile().getAbsolutePath()); System.setProperty("PIDFILE", this.temporaryFolder.newFile().getAbsolutePath());
ApplicationPidListener listener = new ApplicationPidListener(file); ApplicationPidListener listener = new ApplicationPidListener(file);
listener.onApplicationEvent(EVENT); listener.onApplicationEvent(EVENT);
assertThat(FileCopyUtils.copyToString(new FileReader(System.getProperty("PIDFILE"))), not(isEmptyString())); assertThat(
FileCopyUtils.copyToString(new FileReader(System.getProperty("PIDFILE"))),
not(isEmptyString()));
} }
} }
...@@ -465,11 +465,11 @@ HTTPS connector: ...@@ -465,11 +465,11 @@ HTTPS connector:
[[howto-use-tomcat-behind-a-proxy-server]] [[howto-use-tomcat-behind-a-proxy-server]]
=== Use Tomcat behind a front-end proxy server === Use Tomcat behind a front-end proxy server
Spring Boot will automatically configure Tomcat's `RemoteIpValve` if you enable it. This allows you to Spring Boot will automatically configure Tomcat's `RemoteIpValve` if you enable it. This
transparently use the standard `x-forwarded-for` and `x-forwarded-proto` headers that allows you to transparently use the standard `x-forwarded-for` and `x-forwarded-proto`
most front-end proxy servers add. The valve is switched on by setting one or both of these headers that most front-end proxy servers add. The valve is switched on by setting one or
properties to something non-empty (these are the conventional values used by most proxies, and if both of these properties to something non-empty (these are the conventional values used by
you only set one the other will be set automatically): most proxies, and if you only set one the other will be set automatically):
[indent=0] [indent=0]
---- ----
...@@ -477,9 +477,8 @@ you only set one the other will be set automatically): ...@@ -477,9 +477,8 @@ you only set one the other will be set automatically):
server.tomcat.protocol_header=x-forwarded-protocol server.tomcat.protocol_header=x-forwarded-protocol
---- ----
If your proxy uses different headers you can If your proxy uses different headers you can customize the valve's configuration by adding
customize the valve's configuration by adding some entries to `application.properties`, some entries to `application.properties`, e.g.
e.g.
[indent=0] [indent=0]
---- ----
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment