|
|
|
@ -19,6 +19,10 @@ package org.springframework.boot.availability; |
|
|
|
import java.util.HashMap; |
|
|
|
import java.util.HashMap; |
|
|
|
import java.util.Map; |
|
|
|
import java.util.Map; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import org.apache.commons.logging.Log; |
|
|
|
|
|
|
|
import org.apache.commons.logging.LogFactory; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import org.springframework.context.ApplicationEventPublisher; |
|
|
|
import org.springframework.context.ApplicationListener; |
|
|
|
import org.springframework.context.ApplicationListener; |
|
|
|
import org.springframework.util.Assert; |
|
|
|
import org.springframework.util.Assert; |
|
|
|
|
|
|
|
|
|
|
|
@ -34,6 +38,8 @@ import org.springframework.util.Assert; |
|
|
|
public class ApplicationAvailabilityBean |
|
|
|
public class ApplicationAvailabilityBean |
|
|
|
implements ApplicationAvailability, ApplicationListener<AvailabilityChangeEvent<?>> { |
|
|
|
implements ApplicationAvailability, ApplicationListener<AvailabilityChangeEvent<?>> { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static final Log logger = LogFactory.getLog(ApplicationAvailability.class); |
|
|
|
|
|
|
|
|
|
|
|
private final Map<Class<? extends AvailabilityState>, AvailabilityChangeEvent<?>> events = new HashMap<>(); |
|
|
|
private final Map<Class<? extends AvailabilityState>, AvailabilityChangeEvent<?>> events = new HashMap<>(); |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
@ -58,10 +64,31 @@ public class ApplicationAvailabilityBean |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public void onApplicationEvent(AvailabilityChangeEvent<?> event) { |
|
|
|
public void onApplicationEvent(AvailabilityChangeEvent<?> event) { |
|
|
|
|
|
|
|
logStateChange(event); |
|
|
|
Class<? extends AvailabilityState> stateType = getStateType(event.getState()); |
|
|
|
Class<? extends AvailabilityState> stateType = getStateType(event.getState()); |
|
|
|
this.events.put(stateType, event); |
|
|
|
this.events.put(stateType, event); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void logStateChange(AvailabilityChangeEvent<?> event) { |
|
|
|
|
|
|
|
Class<? extends AvailabilityState> stateType = getStateType(event.getState()); |
|
|
|
|
|
|
|
StringBuilder message = new StringBuilder( |
|
|
|
|
|
|
|
"Application availability state " + stateType.getSimpleName() + " changed"); |
|
|
|
|
|
|
|
AvailabilityChangeEvent<? extends AvailabilityState> lastChangeEvent = getLastChangeEvent(stateType); |
|
|
|
|
|
|
|
if (lastChangeEvent != null) { |
|
|
|
|
|
|
|
message.append(" from " + lastChangeEvent.getState()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
message.append(" to " + event.getState()); |
|
|
|
|
|
|
|
if (event.getSource() != null) { |
|
|
|
|
|
|
|
if (event.getSource() instanceof Throwable) { |
|
|
|
|
|
|
|
message.append(": " + event.getSource()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else if (!(event.getSource() instanceof ApplicationEventPublisher)) { |
|
|
|
|
|
|
|
message.append(": " + event.getSource().getClass().getName()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
logger.info(message); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@SuppressWarnings("unchecked") |
|
|
|
@SuppressWarnings("unchecked") |
|
|
|
private Class<? extends AvailabilityState> getStateType(AvailabilityState state) { |
|
|
|
private Class<? extends AvailabilityState> getStateType(AvailabilityState state) { |
|
|
|
if (state instanceof Enum) { |
|
|
|
if (state instanceof Enum) { |
|
|
|
|