Browse Source

WebSocketMessageBrokerStats implements SmartInitializingSingleton

Closes gh-26536
pull/33657/head
rstoyanchev 2 years ago
parent
commit
6db00e63c7
  1. 71
      spring-websocket/src/main/java/org/springframework/web/socket/config/WebSocketMessageBrokerStats.java

71
spring-websocket/src/main/java/org/springframework/web/socket/config/WebSocketMessageBrokerStats.java

@ -26,6 +26,7 @@ import java.util.concurrent.TimeUnit;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.SmartInitializingSingleton;
import org.springframework.core.task.TaskExecutor; import org.springframework.core.task.TaskExecutor;
import org.springframework.lang.Nullable; import org.springframework.lang.Nullable;
import org.springframework.messaging.simp.stomp.StompBrokerRelayMessageHandler; import org.springframework.messaging.simp.stomp.StompBrokerRelayMessageHandler;
@ -53,7 +54,7 @@ import org.springframework.web.socket.messaging.SubProtocolWebSocketHandler;
* @author Sam Brannen * @author Sam Brannen
* @since 4.1 * @since 4.1
*/ */
public class WebSocketMessageBrokerStats { public class WebSocketMessageBrokerStats implements SmartInitializingSingleton {
private static final Log logger = LogFactory.getLog(WebSocketMessageBrokerStats.class); private static final Log logger = LogFactory.getLog(WebSocketMessageBrokerStats.class);
@ -84,24 +85,6 @@ public class WebSocketMessageBrokerStats {
public void setSubProtocolWebSocketHandler(SubProtocolWebSocketHandler webSocketHandler) { public void setSubProtocolWebSocketHandler(SubProtocolWebSocketHandler webSocketHandler) {
this.webSocketHandler = webSocketHandler; this.webSocketHandler = webSocketHandler;
this.stompSubProtocolHandler = initStompSubProtocolHandler();
}
@Nullable
private StompSubProtocolHandler initStompSubProtocolHandler() {
if (this.webSocketHandler == null) {
return null;
}
for (SubProtocolHandler handler : this.webSocketHandler.getProtocolHandlers()) {
if (handler instanceof StompSubProtocolHandler stompHandler) {
return stompHandler;
}
}
SubProtocolHandler defaultHandler = this.webSocketHandler.getDefaultProtocolHandler();
if (defaultHandler instanceof StompSubProtocolHandler stompHandler) {
return stompHandler;
}
return null;
} }
public void setStompBrokerRelay(StompBrokerRelayMessageHandler stompBrokerRelay) { public void setStompBrokerRelay(StompBrokerRelayMessageHandler stompBrokerRelay) {
@ -118,17 +101,6 @@ public class WebSocketMessageBrokerStats {
public void setSockJsTaskScheduler(TaskScheduler sockJsTaskScheduler) { public void setSockJsTaskScheduler(TaskScheduler sockJsTaskScheduler) {
this.sockJsTaskScheduler = sockJsTaskScheduler; this.sockJsTaskScheduler = sockJsTaskScheduler;
this.loggingTask = initLoggingTask(TimeUnit.MINUTES.toMillis(1));
}
@Nullable
private ScheduledFuture<?> initLoggingTask(long initialDelay) {
if (this.sockJsTaskScheduler != null && this.loggingPeriod > 0 && logger.isInfoEnabled()) {
return this.sockJsTaskScheduler.scheduleWithFixedDelay(
() -> logger.info(WebSocketMessageBrokerStats.this.toString()),
Instant.now().plusMillis(initialDelay), Duration.ofMillis(this.loggingPeriod));
}
return null;
} }
/** /**
@ -137,12 +109,12 @@ public class WebSocketMessageBrokerStats {
* <p>By default this property is set to 30 minutes (30 * 60 * 1000). * <p>By default this property is set to 30 minutes (30 * 60 * 1000).
*/ */
public void setLoggingPeriod(long period) { public void setLoggingPeriod(long period) {
this.loggingPeriod = period;
if (this.loggingTask != null) { if (this.loggingTask != null) {
this.loggingTask.cancel(true); this.loggingTask.cancel(true);
}
this.loggingPeriod = period;
this.loggingTask = initLoggingTask(0); this.loggingTask = initLoggingTask(0);
} }
}
/** /**
* Return the configured logging period frequency in milliseconds. * Return the configured logging period frequency in milliseconds.
@ -151,6 +123,41 @@ public class WebSocketMessageBrokerStats {
return this.loggingPeriod; return this.loggingPeriod;
} }
@Override
public void afterSingletonsInstantiated() {
this.stompSubProtocolHandler = initStompSubProtocolHandler();
this.loggingTask = initLoggingTask(TimeUnit.MINUTES.toMillis(1));
}
@Nullable
private StompSubProtocolHandler initStompSubProtocolHandler() {
if (this.webSocketHandler == null) {
return null;
}
for (SubProtocolHandler handler : this.webSocketHandler.getProtocolHandlers()) {
if (handler instanceof StompSubProtocolHandler stompHandler) {
return stompHandler;
}
}
SubProtocolHandler defaultHandler = this.webSocketHandler.getDefaultProtocolHandler();
if (defaultHandler instanceof StompSubProtocolHandler stompHandler) {
return stompHandler;
}
return null;
}
@Nullable
private ScheduledFuture<?> initLoggingTask(long initialDelay) {
if (this.sockJsTaskScheduler != null && this.loggingPeriod > 0 && logger.isInfoEnabled()) {
return this.sockJsTaskScheduler.scheduleWithFixedDelay(
() -> logger.info(WebSocketMessageBrokerStats.this.toString()),
Instant.now().plusMillis(initialDelay), Duration.ofMillis(this.loggingPeriod));
}
return null;
}
/** /**
* Get stats about WebSocket sessions. * Get stats about WebSocket sessions.
*/ */

Loading…
Cancel
Save