package org.sef4j.testwebapp.config; import java.util.Map; import org.sef4j.core.api.session.InOutEventsClientSessionManager; import org.sef4j.core.util.factorydef.ObjectByDefRepositories; import org.sef4j.springmsg.websocket.ClientSessionTransportWebSocketHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; import org.springframework.messaging.simp.config.MessageBrokerRegistry; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer; import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; import org.springframework.web.socket.config.annotation.StompEndpointRegistry; import org.springframework.web.socket.config.annotation.WebSocketConfigurer; import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; import org.springframework.web.socket.server.HandshakeInterceptor; @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer implements WebSocketConfigurer{ private static final Logger LOG = LoggerFactory.getLogger(WebSocketConfig.class); @Autowired public ObjectByDefRepositories sharedObjByDefRepositories; @Bean public InOutEventsClientSessionManager inOutEventsClientSessionManager() { return new InOutEventsClientSessionManager(sharedObjByDefRepositories); } @Bean public ClientSessionTransportWebSocketHandler clientSessionTransportWebSocketHandler() { return new ClientSessionTransportWebSocketHandler(inOutEventsClientSessionManager()); } @Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker("/topic"); config.setApplicationDestinationPrefixes("/app/async"); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/pendingCount") .addInterceptors(new LoggerHandshakeInterceptor()) .withSockJS(); } @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(clientSessionTransportWebSocketHandler(), "/pendingCount"); } protected static class LoggerHandshakeInterceptor implements HandshakeInterceptor { @Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception { LOG.info("WebSocket beforeHandshake"); return true; } @Override public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) { LOG.info("WebSocket afterHandshake"); } } }