From fbeaee13c0816fe8150100bd3959cae584628425 Mon Sep 17 00:00:00 2001 From: lbw Date: Thu, 19 May 2022 11:52:44 +0800 Subject: [PATCH] :rewind: Reverting changes. pigx-common-websocket Error --- .../pigx/common/log/util/SysLogUtils.java | 13 +-- ...LocalMessageDistributorConfiguration.java} | 9 +- .../MessageDistributorTypeConstants.java | 2 - ...RedisMessageDistributorConfiguration.java} | 41 +++++--- .../config/SockJsServiceConfigurer.java | 18 ---- .../config/WebSocketAutoConfiguration.java | 70 ++++---------- .../config/WebSocketHandlerConfig.java | 70 ++++++++++---- .../{ => config}/WebSocketMessageSender.java | 23 ++++- .../websocket/config/WebSocketProperties.java | 46 +-------- .../custom/PigxSessionKeyGenerator.java | 7 +- .../AbstractMessageDistributor.java | 64 ------------- .../distribute/LocalMessageDistributor.java | 8 +- .../websocket/distribute/MessageDO.java | 15 +-- .../websocket/distribute/MessageSender.java | 34 +++++++ .../distribute/RedisMessageDistributor.java | 45 +++------ .../RedisMessageListenerInitializer.java | 27 ------ .../RedisWebsocketMessageListener.java | 41 ++++++++ .../exception/ErrorJsonMessageException.java | 14 --- .../ConcurrentWebSocketSessionOptions.java | 34 ------- .../handler/CustomWebSocketHandler.java | 68 ++++--------- .../handler/PingJsonMessageHandler.java | 2 +- .../holder/JsonMessageHandlerHolder.java | 7 +- .../holder/JsonMessageHandlerInitializer.java | 31 ------ .../MapSessionWebSocketHandlerDecorator.java | 46 +++++++++ .../SessionKeyGenerator.java | 2 +- .../holder/WebSocketSessionHolder.java | 65 +++++++++++++ .../message/AbstractJsonWebSocketMessage.java | 22 +++++ .../message/JsonWebSocketMessage.java | 19 ++-- .../message/PingJsonWebSocketMessage.java | 2 +- .../message/PongJsonWebSocketMessage.java | 2 +- .../session/DefaultWebSocketSessionStore.java | 96 ------------------- .../MapSessionWebSocketHandlerDecorator.java | 57 ----------- .../session/WebSocketSessionStore.java | 43 --------- ...itional-spring-configuration-metadata.json | 32 ------- .../main/resources/META-INF/spring.factories | 4 +- 35 files changed, 395 insertions(+), 684 deletions(-) rename pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/{LocalMessageDistributorConfig.java => LocalMessageDistributorConfiguration.java} (75%) rename pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/{RedisMessageDistributorConfig.java => RedisMessageDistributorConfiguration.java} (62%) delete mode 100644 pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/SockJsServiceConfigurer.java rename pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/{ => config}/WebSocketMessageSender.java (56%) delete mode 100644 pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/AbstractMessageDistributor.java create mode 100644 pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/MessageSender.java delete mode 100644 pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/RedisMessageListenerInitializer.java create mode 100644 pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/RedisWebsocketMessageListener.java delete mode 100644 pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/exception/ErrorJsonMessageException.java delete mode 100644 pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/handler/ConcurrentWebSocketSessionOptions.java delete mode 100644 pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/holder/JsonMessageHandlerInitializer.java create mode 100644 pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/holder/MapSessionWebSocketHandlerDecorator.java rename pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/{session => holder}/SessionKeyGenerator.java (87%) create mode 100644 pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/holder/WebSocketSessionHolder.java create mode 100644 pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/message/AbstractJsonWebSocketMessage.java delete mode 100644 pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/session/DefaultWebSocketSessionStore.java delete mode 100644 pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/session/MapSessionWebSocketHandlerDecorator.java delete mode 100644 pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/session/WebSocketSessionStore.java delete mode 100644 pigx-common/pigx-common-websocket/src/main/resources/META-INF/additional-spring-configuration-metadata.json diff --git a/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/util/SysLogUtils.java b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/util/SysLogUtils.java index 1c061cc14..76f82e683 100644 --- a/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/util/SysLogUtils.java +++ b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/util/SysLogUtils.java @@ -100,15 +100,12 @@ public class SysLogUtils { return authentication.getName(); } - - /** * 获取spel 定义的参数值 - * * @param context 参数容器 - * @param key key - * @param clazz 需要返回的类型 - * @param 返回泛型 + * @param key key + * @param clazz 需要返回的类型 + * @param 返回泛型 * @return 参数值 */ public T getValue(EvaluationContext context, String key, Class clazz) { @@ -119,8 +116,7 @@ public class SysLogUtils { /** * 获取参数容器 - * - * @param arguments 方法的参数列表 + * @param arguments 方法的参数列表 * @param signatureMethod 被执行的方法体 * @return 装载参数的容器 */ @@ -135,4 +131,5 @@ public class SysLogUtils { } return context; } + } diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/LocalMessageDistributorConfig.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/LocalMessageDistributorConfiguration.java similarity index 75% rename from pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/LocalMessageDistributorConfig.java rename to pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/LocalMessageDistributorConfiguration.java index f76952ef8..baeedc499 100644 --- a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/LocalMessageDistributorConfig.java +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/LocalMessageDistributorConfiguration.java @@ -2,8 +2,6 @@ package com.pig4cloud.pigx.common.websocket.config; import com.pig4cloud.pigx.common.websocket.distribute.LocalMessageDistributor; import com.pig4cloud.pigx.common.websocket.distribute.MessageDistributor; -import com.pig4cloud.pigx.common.websocket.session.WebSocketSessionStore; -import lombok.RequiredArgsConstructor; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; @@ -17,10 +15,7 @@ import org.springframework.context.annotation.Configuration; @ConditionalOnProperty(prefix = WebSocketProperties.PREFIX, name = "message-distributor", havingValue = MessageDistributorTypeConstants.LOCAL) @Configuration(proxyBeanMethods = false) -@RequiredArgsConstructor -public class LocalMessageDistributorConfig { - - private final WebSocketSessionStore webSocketSessionStore; +public class LocalMessageDistributorConfiguration { /** * 本地基于内存的消息分发,不支持集群 @@ -29,7 +24,7 @@ public class LocalMessageDistributorConfig { @Bean @ConditionalOnMissingBean(MessageDistributor.class) public LocalMessageDistributor messageDistributor() { - return new LocalMessageDistributor(webSocketSessionStore); + return new LocalMessageDistributor(); } } diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/MessageDistributorTypeConstants.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/MessageDistributorTypeConstants.java index dc397c3e4..9e53ec911 100644 --- a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/MessageDistributorTypeConstants.java +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/MessageDistributorTypeConstants.java @@ -1,8 +1,6 @@ package com.pig4cloud.pigx.common.websocket.config; /** - * websocket 消息分发器类型常量类 - * * @author hccake */ public final class MessageDistributorTypeConstants { diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/RedisMessageDistributorConfig.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/RedisMessageDistributorConfiguration.java similarity index 62% rename from pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/RedisMessageDistributorConfig.java rename to pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/RedisMessageDistributorConfiguration.java index a6263dd4f..dc5f98efd 100644 --- a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/RedisMessageDistributorConfig.java +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/RedisMessageDistributorConfiguration.java @@ -2,8 +2,7 @@ package com.pig4cloud.pigx.common.websocket.config; import com.pig4cloud.pigx.common.websocket.distribute.MessageDistributor; import com.pig4cloud.pigx.common.websocket.distribute.RedisMessageDistributor; -import com.pig4cloud.pigx.common.websocket.distribute.RedisMessageListenerInitializer; -import com.pig4cloud.pigx.common.websocket.session.WebSocketSessionStore; +import com.pig4cloud.pigx.common.websocket.distribute.RedisWebsocketMessageListener; import lombok.RequiredArgsConstructor; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -13,8 +12,11 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.listener.PatternTopic; import org.springframework.data.redis.listener.RedisMessageListenerContainer; +import javax.annotation.PostConstruct; + /** * 基于 Redis Pub/Sub 的消息分发器 * @@ -24,15 +26,19 @@ import org.springframework.data.redis.listener.RedisMessageListenerContainer; @ConditionalOnProperty(prefix = WebSocketProperties.PREFIX, name = "message-distributor", havingValue = MessageDistributorTypeConstants.REDIS, matchIfMissing = true) @Configuration(proxyBeanMethods = false) -@RequiredArgsConstructor -public class RedisMessageDistributorConfig { - - private final WebSocketSessionStore webSocketSessionStore; +public class RedisMessageDistributorConfiguration { @Bean @ConditionalOnMissingBean(MessageDistributor.class) public RedisMessageDistributor messageDistributor(StringRedisTemplate stringRedisTemplate) { - return new RedisMessageDistributor(webSocketSessionStore, stringRedisTemplate); + return new RedisMessageDistributor(stringRedisTemplate); + } + + @Bean + @ConditionalOnBean(RedisMessageDistributor.class) + @ConditionalOnMissingBean + public RedisWebsocketMessageListener redisWebsocketMessageListener(StringRedisTemplate stringRedisTemplate) { + return new RedisWebsocketMessageListener(stringRedisTemplate); } @Bean @@ -44,12 +50,21 @@ public class RedisMessageDistributorConfig { return container; } - @Bean - @ConditionalOnMissingBean - public RedisMessageListenerInitializer redisMessageListenerInitializer( - RedisMessageListenerContainer redisMessageListenerContainer, - RedisMessageDistributor redisWebsocketMessageListener) { - return new RedisMessageListenerInitializer(redisMessageListenerContainer, redisWebsocketMessageListener); + @Configuration(proxyBeanMethods = false) + @ConditionalOnMissingBean(MessageDistributor.class) + @RequiredArgsConstructor + static class RedisMessageListenerRegisterConfiguration { + + private final RedisMessageListenerContainer redisMessageListenerContainer; + + private final RedisWebsocketMessageListener redisWebsocketMessageListener; + + @PostConstruct + public void addMessageListener() { + redisMessageListenerContainer.addMessageListener(redisWebsocketMessageListener, + new PatternTopic(RedisWebsocketMessageListener.CHANNEL)); + } + } } diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/SockJsServiceConfigurer.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/SockJsServiceConfigurer.java deleted file mode 100644 index 97a4bff8f..000000000 --- a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/SockJsServiceConfigurer.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.pig4cloud.pigx.common.websocket.config; - -import org.springframework.web.socket.config.annotation.SockJsServiceRegistration; - -/** - * SockJsService 配置类 - * - * @author hccake - */ -public interface SockJsServiceConfigurer { - - /** - * 配置 sockjs 相关 - * @param sockJsServiceRegistration sockJsService 注册类 - */ - void config(SockJsServiceRegistration sockJsServiceRegistration); - -} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/WebSocketAutoConfiguration.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/WebSocketAutoConfiguration.java index b917b2106..7f819b32a 100644 --- a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/WebSocketAutoConfiguration.java +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/WebSocketAutoConfiguration.java @@ -1,88 +1,50 @@ package com.pig4cloud.pigx.common.websocket.config; import com.pig4cloud.pigx.common.websocket.handler.JsonMessageHandler; -import com.pig4cloud.pigx.common.websocket.handler.PingJsonMessageHandler; -import com.pig4cloud.pigx.common.websocket.holder.JsonMessageHandlerInitializer; -import com.pig4cloud.pigx.common.websocket.message.JsonWebSocketMessage; +import com.pig4cloud.pigx.common.websocket.holder.JsonMessageHandlerHolder; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.config.annotation.EnableWebSocket; -import org.springframework.web.socket.config.annotation.SockJsServiceRegistration; import org.springframework.web.socket.config.annotation.WebSocketConfigurer; -import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistration; import org.springframework.web.socket.server.HandshakeInterceptor; +import javax.annotation.PostConstruct; import java.util.List; /** * websocket自动配置 * - * @author Yakir Hccake + * @author Yakir */ -@Import({ WebSocketHandlerConfig.class, LocalMessageDistributorConfig.class, RedisMessageDistributorConfig.class }) +@Import(WebSocketHandlerConfig.class) @EnableWebSocket @RequiredArgsConstructor -@EnableConfigurationProperties(WebSocketProperties.class) public class WebSocketAutoConfiguration { private final WebSocketProperties webSocketProperties; + private final List jsonMessageHandlerList; + @Bean @ConditionalOnMissingBean public WebSocketConfigurer webSocketConfigurer(List handshakeInterceptor, - WebSocketHandler webSocketHandler, - @Autowired(required = false) SockJsServiceConfigurer sockJsServiceConfigurer) { - return registry -> { - WebSocketHandlerRegistration registration = registry - .addHandler(webSocketHandler, webSocketProperties.getPath()) - .addInterceptors(handshakeInterceptor.toArray(new HandshakeInterceptor[0])); - - String[] allowedOrigins = webSocketProperties.getAllowedOrigins(); - if (allowedOrigins != null && allowedOrigins.length > 0) { - registration.setAllowedOrigins(allowedOrigins); - } - - String[] allowedOriginPatterns = webSocketProperties.getAllowedOriginPatterns(); - if (allowedOriginPatterns != null && allowedOriginPatterns.length > 0) { - registration.setAllowedOriginPatterns(allowedOriginPatterns); - } - - if (webSocketProperties.isWithSockjs()) { - SockJsServiceRegistration sockJsServiceRegistration = registration.withSockJS(); - if (sockJsServiceConfigurer != null) { - sockJsServiceConfigurer.config(sockJsServiceRegistration); - } - } - }; + WebSocketHandler webSocketHandler) { + return registry -> registry.addHandler(webSocketHandler, webSocketProperties.getPath()) + .setAllowedOrigins(webSocketProperties.getAllowOrigins()) + .addInterceptors(handshakeInterceptor.toArray(new HandshakeInterceptor[0])); } /** - * 心跳处理器 - * @return PingJsonMessageHandler + * 初始化时将所有的jsonMessageHandler注册到JsonMessageHandlerHolder中 */ - @Bean - @ConditionalOnProperty(prefix = WebSocketProperties.PREFIX, name = "heartbeat", havingValue = "true", - matchIfMissing = true) - public PingJsonMessageHandler pingJsonMessageHandler() { - return new PingJsonMessageHandler(); - } - - /** - * 注册 JsonMessageHandlerInitializer 收集所有的 json 类型消息处理器 - * @param jsonMessageHandlerList json 类型消息处理器 - * @return JsonMessageHandlerInitializer - */ - @Bean - @ConditionalOnMissingBean - public JsonMessageHandlerInitializer jsonMessageHandlerInitializer( - List> jsonMessageHandlerList) { - return new JsonMessageHandlerInitializer(jsonMessageHandlerList); + @PostConstruct + public void initJsonMessageHandlerHolder() { + for (JsonMessageHandler jsonMessageHandler : jsonMessageHandlerList) { + JsonMessageHandlerHolder.addHandler(jsonMessageHandler); + } } } diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/WebSocketHandlerConfig.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/WebSocketHandlerConfig.java index 4fbe62e4c..4c7809709 100644 --- a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/WebSocketHandlerConfig.java +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/WebSocketHandlerConfig.java @@ -1,47 +1,79 @@ package com.pig4cloud.pigx.common.websocket.config; +import com.pig4cloud.pigx.common.websocket.custom.PigxSessionKeyGenerator; +import com.pig4cloud.pigx.common.websocket.custom.UserAttributeHandshakeInterceptor; +import com.pig4cloud.pigx.common.websocket.handler.CustomPlanTextMessageHandler; import com.pig4cloud.pigx.common.websocket.handler.CustomWebSocketHandler; +import com.pig4cloud.pigx.common.websocket.handler.PingJsonMessageHandler; import com.pig4cloud.pigx.common.websocket.handler.PlanTextMessageHandler; -import com.pig4cloud.pigx.common.websocket.session.DefaultWebSocketSessionStore; -import com.pig4cloud.pigx.common.websocket.session.MapSessionWebSocketHandlerDecorator; -import com.pig4cloud.pigx.common.websocket.session.SessionKeyGenerator; -import com.pig4cloud.pigx.common.websocket.session.WebSocketSessionStore; +import com.pig4cloud.pigx.common.websocket.holder.MapSessionWebSocketHandlerDecorator; +import com.pig4cloud.pigx.common.websocket.holder.SessionKeyGenerator; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.cloud.client.ServiceInstance; import org.springframework.context.annotation.Bean; import org.springframework.web.socket.WebSocketHandler; +import org.springframework.web.socket.handler.TextWebSocketHandler; +import org.springframework.web.socket.server.HandshakeInterceptor; /** * @author Hccake 2021/1/5 * @version 1.0 */ @RequiredArgsConstructor +@EnableConfigurationProperties(WebSocketProperties.class) public class WebSocketHandlerConfig { private final WebSocketProperties webSocketProperties; - /** - * WebSocket session 存储器 - * @return DefaultWebSocketSessionStore - */ @Bean - @ConditionalOnMissingBean - public WebSocketSessionStore webSocketSessionStore( - @Autowired(required = false) SessionKeyGenerator sessionKeyGenerator) { - return new DefaultWebSocketSessionStore(sessionKeyGenerator); + @ConditionalOnMissingBean(SessionKeyGenerator.class) + public SessionKeyGenerator sessionKeyGenerator(ServiceInstance serviceInstance) { + return new PigxSessionKeyGenerator(serviceInstance); } @Bean - @ConditionalOnMissingBean(WebSocketHandler.class) - public WebSocketHandler webSocketHandler(WebSocketSessionStore webSocketSessionStore, - @Autowired(required = false) PlanTextMessageHandler planTextMessageHandler) { - CustomWebSocketHandler customWebSocketHandler = new CustomWebSocketHandler(planTextMessageHandler); + public HandshakeInterceptor handshakeInterceptor() { + return new UserAttributeHandshakeInterceptor(); + } + + @Bean + @ConditionalOnMissingBean(PlanTextMessageHandler.class) + public PlanTextMessageHandler planTextMessageHandler() { + return new CustomPlanTextMessageHandler(); + } + + @Bean + @ConditionalOnMissingBean({ TextWebSocketHandler.class, PlanTextMessageHandler.class }) + public WebSocketHandler webSocketHandler1(@Autowired(required = false) SessionKeyGenerator sessionKeyGenerator) { + CustomWebSocketHandler customWebSocketHandler = new CustomWebSocketHandler(); if (webSocketProperties.isMapSession()) { - return new MapSessionWebSocketHandlerDecorator(customWebSocketHandler, webSocketSessionStore, - webSocketProperties.getConcurrent()); + return new MapSessionWebSocketHandlerDecorator(customWebSocketHandler, sessionKeyGenerator); } return customWebSocketHandler; } -} \ No newline at end of file + @Bean + @ConditionalOnBean(PlanTextMessageHandler.class) + @ConditionalOnMissingBean(TextWebSocketHandler.class) + public WebSocketHandler webSocketHandler2(@Autowired(required = false) SessionKeyGenerator sessionKeyGenerator, + PlanTextMessageHandler planTextMessageHandler) { + CustomWebSocketHandler customWebSocketHandler = new CustomWebSocketHandler(planTextMessageHandler); + if (webSocketProperties.isMapSession()) { + return new MapSessionWebSocketHandlerDecorator(customWebSocketHandler, sessionKeyGenerator); + } + return customWebSocketHandler; + } + + @Bean + @ConditionalOnProperty(prefix = WebSocketProperties.PREFIX, name = "heartbeat", havingValue = "true", + matchIfMissing = true) + public PingJsonMessageHandler pingJsonMessageHandler() { + return new PingJsonMessageHandler(); + } + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/WebSocketMessageSender.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/WebSocketMessageSender.java similarity index 56% rename from pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/WebSocketMessageSender.java rename to pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/WebSocketMessageSender.java index 001bfb6d9..07ff60b97 100644 --- a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/WebSocketMessageSender.java +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/WebSocketMessageSender.java @@ -1,21 +1,38 @@ -package com.pig4cloud.pigx.common.websocket; +package com.pig4cloud.pigx.common.websocket.config; import cn.hutool.json.JSONUtil; +import com.pig4cloud.pigx.common.websocket.holder.WebSocketSessionHolder; import com.pig4cloud.pigx.common.websocket.message.JsonWebSocketMessage; import lombok.extern.slf4j.Slf4j; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; import java.io.IOException; +import java.util.Collection; /** * @author Hccake 2021/1/4 * @version 1.0 */ @Slf4j -public final class WebSocketMessageSender { +public class WebSocketMessageSender { - private WebSocketMessageSender() { + public static void broadcast(String message) { + Collection sessions = WebSocketSessionHolder.getSessions(); + for (WebSocketSession session : sessions) { + send(session, message); + } + } + + public static boolean send(Object sessionKey, String message) { + WebSocketSession session = WebSocketSessionHolder.getSession(sessionKey); + if (session == null) { + log.info("[send] 当前 sessionKey:{} 对应 session 不在本服务中", sessionKey); + return false; + } + else { + return send(session, message); + } } public static void send(WebSocketSession session, JsonWebSocketMessage message) { diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/WebSocketProperties.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/WebSocketProperties.java index 2b481daf4..8bdc84cee 100644 --- a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/WebSocketProperties.java +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/config/WebSocketProperties.java @@ -1,9 +1,7 @@ package com.pig4cloud.pigx.common.websocket.config; -import com.pig4cloud.pigx.common.websocket.handler.ConcurrentWebSocketSessionOptions; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.context.properties.NestedConfigurationProperty; /** * websocket props @@ -24,14 +22,9 @@ public class WebSocketProperties { private String path = "/ws/info"; /** - * 允许跨域的源 + * 允许访问源 */ - private String[] allowedOrigins; - - /** - * 允许跨域来源的匹配规则 - */ - private String[] allowedOriginPatterns = new String[] { "*" }; + private String allowOrigins = "*"; /** * 是否支持部分消息 @@ -48,42 +41,9 @@ public class WebSocketProperties { */ private boolean mapSession = true; - /** - * 是否开启 sockJs 支持 - */ - private boolean withSockjs = false; - - /** - * 多线程发送相关配置 - */ - @NestedConfigurationProperty - private ConcurrentWebSocketSessionOptions concurrent = new ConcurrentWebSocketSessionOptions(); - /** * 消息分发器:local | redis,默认 local, 如果自定义的话,可以配置为其他任意值 */ - private MessageDistributorTypeEnum messageDistributor = MessageDistributorTypeEnum.LOCAL; - - /** - * 消息分发器类型,用于解决集群场景下的消息跨节点推送问题 - */ - enum MessageDistributorTypeEnum { - - /** - * 本地缓存,不做跨节点分发 - */ - LOCAL, - - /** - * redis,利用 redis pub/sub 处理 - */ - REDIS, - - /** - * 自定义,用户自己实现一个 MessageDistributor - */ - CUSTOM; - - } + private String messageDistributor = MessageDistributorTypeConstants.LOCAL; } diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/custom/PigxSessionKeyGenerator.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/custom/PigxSessionKeyGenerator.java index 7fc42514e..ab3712476 100644 --- a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/custom/PigxSessionKeyGenerator.java +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/custom/PigxSessionKeyGenerator.java @@ -1,8 +1,9 @@ package com.pig4cloud.pigx.common.websocket.custom; import com.pig4cloud.pigx.common.security.service.PigxUser; -import com.pig4cloud.pigx.common.websocket.session.SessionKeyGenerator; +import com.pig4cloud.pigx.common.websocket.holder.SessionKeyGenerator; import lombok.RequiredArgsConstructor; +import org.springframework.cloud.client.ServiceInstance; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.WebSocketSession; @@ -14,6 +15,8 @@ import org.springframework.web.socket.WebSocketSession; @RequiredArgsConstructor public class PigxSessionKeyGenerator implements SessionKeyGenerator { + private final ServiceInstance instance; + /** * 获取当前session的唯一标识 * @param webSocketSession 当前session @@ -27,7 +30,7 @@ public class PigxSessionKeyGenerator implements SessionKeyGenerator { if (obj instanceof PigxUser) { PigxUser user = (PigxUser) obj; // userId 作为唯一区分 - return user.getId(); + return String.valueOf(user.getId()); } return null; diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/AbstractMessageDistributor.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/AbstractMessageDistributor.java deleted file mode 100644 index 04f936cb3..000000000 --- a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/AbstractMessageDistributor.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.pig4cloud.pigx.common.websocket.distribute; - -import cn.hutool.core.collection.CollectionUtil; -import com.pig4cloud.pigx.common.websocket.WebSocketMessageSender; -import com.pig4cloud.pigx.common.websocket.session.WebSocketSessionStore; -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.socket.WebSocketSession; - -import java.util.Collection; - -/** - * @author hccake - */ -@Slf4j -public abstract class AbstractMessageDistributor implements MessageDistributor { - - private final WebSocketSessionStore webSocketSessionStore; - - protected AbstractMessageDistributor(WebSocketSessionStore webSocketSessionStore) { - this.webSocketSessionStore = webSocketSessionStore; - } - - /** - * 对当前服务中的 websocket 连接做消息推送 - * @param messageDO 消息实体 - */ - protected void doSend(MessageDO messageDO) { - - // 是否广播发送 - Boolean needBroadcast = messageDO.getNeedBroadcast(); - - // 获取待发送的 sessionKeys - Collection sessionKeys; - if (needBroadcast != null && needBroadcast) { - sessionKeys = webSocketSessionStore.getSessionKeys(); - } - else { - sessionKeys = messageDO.getSessionKeys(); - } - if (CollectionUtil.isEmpty(sessionKeys)) { - log.warn("发送 websocket 消息,确没有找到对应 sessionKeys, messageDo: {}", messageDO); - return; - } - - String messageText = messageDO.getMessageText(); - Boolean onlyOneClientInSameKey = messageDO.getOnlyOneClientInSameKey(); - - for (Object sessionKey : sessionKeys) { - Collection sessions = webSocketSessionStore.getSessions(sessionKey); - if (CollectionUtil.isNotEmpty(sessions)) { - // 相同 sessionKey 的客户端只推送一次操作 - if (onlyOneClientInSameKey != null && onlyOneClientInSameKey) { - WebSocketSession wsSession = CollectionUtil.get(sessions, 0); - WebSocketMessageSender.send(wsSession, messageText); - continue; - } - for (WebSocketSession wsSession : sessions) { - WebSocketMessageSender.send(wsSession, messageText); - } - } - } - } - -} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/LocalMessageDistributor.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/LocalMessageDistributor.java index 81c3aaadb..c5abdfd16 100644 --- a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/LocalMessageDistributor.java +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/LocalMessageDistributor.java @@ -1,18 +1,12 @@ package com.pig4cloud.pigx.common.websocket.distribute; -import com.pig4cloud.pigx.common.websocket.session.WebSocketSessionStore; - /** * 本地消息分发,直接进行发送 * * @author Hccake 2021/1/12 * @version 1.0 */ -public class LocalMessageDistributor extends AbstractMessageDistributor { - - public LocalMessageDistributor(WebSocketSessionStore webSocketSessionStore) { - super(webSocketSessionStore); - } +public class LocalMessageDistributor implements MessageDistributor, MessageSender { /** * 消息分发 diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/MessageDO.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/MessageDO.java index 98e86d1f8..5f9601bd9 100644 --- a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/MessageDO.java +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/MessageDO.java @@ -19,12 +19,7 @@ public class MessageDO { private Boolean needBroadcast; /** - * 对于拥有相同 sessionKey 的客户端,仅对其中的一个进行发送 - */ - private Boolean onlyOneClientInSameKey; - - /** - * 需要发送的 sessionKeys 集合,当广播时,不需要 + * sessionKeys */ private List sessionKeys; @@ -33,4 +28,12 @@ public class MessageDO { */ private String messageText; + /** + * 构建需要广播的message + * @author lingting 2021-03-25 17:28 + */ + public static MessageDO broadcastMessage(String text) { + return new MessageDO().setMessageText(text).setNeedBroadcast(true); + } + } diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/MessageSender.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/MessageSender.java new file mode 100644 index 000000000..f963f0352 --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/MessageSender.java @@ -0,0 +1,34 @@ +package com.pig4cloud.pigx.common.websocket.distribute; + +import cn.hutool.core.collection.CollectionUtil; +import com.pig4cloud.pigx.common.websocket.config.WebSocketMessageSender; + +import java.util.List; + +/** + * @author Hccake 2021/1/12 + * @version 1.0 + */ +public interface MessageSender { + + /** + * 发送消息 + * @param messageDO 发送的消息 + */ + default void doSend(MessageDO messageDO) { + Boolean needBroadcast = messageDO.getNeedBroadcast(); + String messageText = messageDO.getMessageText(); + List sessionKeys = messageDO.getSessionKeys(); + if (needBroadcast != null && needBroadcast) { + // 广播信息 + WebSocketMessageSender.broadcast(messageText); + } + else if (CollectionUtil.isNotEmpty(sessionKeys)) { + // 指定用户发送 + for (Object sessionKey : sessionKeys) { + WebSocketMessageSender.send(sessionKey, messageText); + } + } + } + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/RedisMessageDistributor.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/RedisMessageDistributor.java index 55e28e436..7fcf30488 100644 --- a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/RedisMessageDistributor.java +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/RedisMessageDistributor.java @@ -1,56 +1,35 @@ package com.pig4cloud.pigx.common.websocket.distribute; import cn.hutool.json.JSONUtil; -import com.pig4cloud.pigx.common.websocket.session.WebSocketSessionStore; -import lombok.extern.slf4j.Slf4j; -import org.springframework.data.redis.connection.Message; -import org.springframework.data.redis.connection.MessageListener; +import lombok.RequiredArgsConstructor; import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.data.redis.serializer.RedisSerializer; + +import java.util.ArrayList; +import java.util.List; /** - * 基于 redis PUB/SUB 的消息分发器, 订阅 websocket 发送消息,接收到消息时进行推送 + * 消息分发器 * * @author Hccake 2021/1/12 * @version 1.0 */ -@Slf4j -public class RedisMessageDistributor extends AbstractMessageDistributor implements MessageListener { - - public static final String CHANNEL = "websocket-send"; +@RequiredArgsConstructor +public class RedisMessageDistributor implements MessageDistributor { private final StringRedisTemplate stringRedisTemplate; - public RedisMessageDistributor(WebSocketSessionStore webSocketSessionStore, - StringRedisTemplate stringRedisTemplate) { - super(webSocketSessionStore); - this.stringRedisTemplate = stringRedisTemplate; - } - /** * 消息分发 * @param messageDO 发送的消息 */ @Override public void distribute(MessageDO messageDO) { + // 包装 sessionKey 适配分布式多环境 + List sessionKeyList = new ArrayList<>(messageDO.getSessionKeys()); + messageDO.setSessionKeys(sessionKeyList); + String str = JSONUtil.toJsonStr(messageDO); - stringRedisTemplate.convertAndSend(CHANNEL, str); - } - - @Override - public void onMessage(Message message, byte[] bytes) { - log.info("redis channel Listener message send {}", message); - byte[] channelBytes = message.getChannel(); - RedisSerializer stringSerializer = stringRedisTemplate.getStringSerializer(); - String channel = stringSerializer.deserialize(channelBytes); - - // 这里没有使用通配符,所以一定是true - if (CHANNEL.equals(channel)) { - byte[] bodyBytes = message.getBody(); - String body = stringSerializer.deserialize(bodyBytes); - MessageDO messageDO = JSONUtil.toBean(body, MessageDO.class); - doSend(messageDO); - } + stringRedisTemplate.convertAndSend(RedisWebsocketMessageListener.CHANNEL, str); } } diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/RedisMessageListenerInitializer.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/RedisMessageListenerInitializer.java deleted file mode 100644 index 4892512f8..000000000 --- a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/RedisMessageListenerInitializer.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.pig4cloud.pigx.common.websocket.distribute; - -import lombok.RequiredArgsConstructor; -import org.springframework.data.redis.listener.PatternTopic; -import org.springframework.data.redis.listener.RedisMessageListenerContainer; - -import javax.annotation.PostConstruct; - -/** - * 初始化 redis 消息的监听器 - * - * @author Hccake - */ -@RequiredArgsConstructor -public class RedisMessageListenerInitializer { - - private final RedisMessageListenerContainer redisMessageListenerContainer; - - private final RedisMessageDistributor redisWebsocketMessageListener; - - @PostConstruct - public void addMessageListener() { - redisMessageListenerContainer.addMessageListener(redisWebsocketMessageListener, - new PatternTopic(RedisMessageDistributor.CHANNEL)); - } - -} \ No newline at end of file diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/RedisWebsocketMessageListener.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/RedisWebsocketMessageListener.java new file mode 100644 index 000000000..5b5be796a --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/distribute/RedisWebsocketMessageListener.java @@ -0,0 +1,41 @@ +package com.pig4cloud.pigx.common.websocket.distribute; + +import cn.hutool.json.JSONUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.connection.Message; +import org.springframework.data.redis.connection.MessageListener; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.serializer.RedisSerializer; + +/** + * redis订阅 websocket 发送消息,接收到消息时进行推送 + * + * @author Hccake 2021/1/12 + * @version 1.0 + */ +@Slf4j +@RequiredArgsConstructor +public class RedisWebsocketMessageListener implements MessageListener, MessageSender { + + public static final String CHANNEL = "websocket-send"; + + private final StringRedisTemplate stringRedisTemplate; + + @Override + public void onMessage(Message message, byte[] bytes) { + log.info("redis channel Listener message send {}", message); + byte[] channelBytes = message.getChannel(); + RedisSerializer stringSerializer = stringRedisTemplate.getStringSerializer(); + String channel = stringSerializer.deserialize(channelBytes); + + // 这里没有使用通配符,所以一定是true + if (CHANNEL.equals(channel)) { + byte[] bodyBytes = message.getBody(); + String body = stringSerializer.deserialize(bodyBytes); + MessageDO messageDO = JSONUtil.toBean(body, MessageDO.class); + doSend(messageDO); + } + } + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/exception/ErrorJsonMessageException.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/exception/ErrorJsonMessageException.java deleted file mode 100644 index f690a7cd0..000000000 --- a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/exception/ErrorJsonMessageException.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.pig4cloud.pigx.common.websocket.exception; - -/** - * 错误的 json 消息 - * - * @author hccake - */ -public class ErrorJsonMessageException extends RuntimeException { - - public ErrorJsonMessageException(String message) { - super(message); - } - -} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/handler/ConcurrentWebSocketSessionOptions.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/handler/ConcurrentWebSocketSessionOptions.java deleted file mode 100644 index 486d60a11..000000000 --- a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/handler/ConcurrentWebSocketSessionOptions.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.pig4cloud.pigx.common.websocket.handler; - -import lombok.Data; -import org.springframework.web.socket.handler.ConcurrentWebSocketSessionDecorator; - -/** - * 并发使用 WebSocketSession 的相关配置 - * - * @author hccake - */ -@Data -public class ConcurrentWebSocketSessionOptions { - - /** - * 是否在多线程环境下进行发送 - */ - private boolean enable = false; - - /** - * 发送时间的限制(ms) - */ - private int sendTimeLimit = 1000 * 5; - - /** - * 发送消息缓冲上限 (byte) - */ - private int bufferSizeLimit = 1024 * 100; - - /** - * 溢出时的执行策略 - */ - ConcurrentWebSocketSessionDecorator.OverflowStrategy overflowStrategy = ConcurrentWebSocketSessionDecorator.OverflowStrategy.TERMINATE; - -} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/handler/CustomWebSocketHandler.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/handler/CustomWebSocketHandler.java index 4b00af77f..6748a22b9 100644 --- a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/handler/CustomWebSocketHandler.java +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/handler/CustomWebSocketHandler.java @@ -4,8 +4,8 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.json.JsonReadFeature; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import com.pig4cloud.pigx.common.websocket.exception.ErrorJsonMessageException; import com.pig4cloud.pigx.common.websocket.holder.JsonMessageHandlerHolder; +import com.pig4cloud.pigx.common.websocket.message.AbstractJsonWebSocketMessage; import com.pig4cloud.pigx.common.websocket.message.JsonWebSocketMessage; import lombok.extern.slf4j.Slf4j; import org.springframework.web.socket.TextMessage; @@ -36,21 +36,18 @@ public class CustomWebSocketHandler extends TextWebSocketHandler { } @Override - public void handleTextMessage(WebSocketSession session, TextMessage message) { + public void handleTextMessage(WebSocketSession session, TextMessage message) throws JsonProcessingException { // 空消息不处理 if (message.getPayloadLength() == 0) { return; } - // 获取消息载荷 + // 消息类型必有一属性type,先解析,获取该属性 String payload = message.getPayload(); - try { - // 尝试使用 json 处理 - handleWithJson(session, payload); - } - catch (ErrorJsonMessageException ex) { - log.debug("消息载荷 [{}] 回退使用 PlanTextMessageHandler,原因:{}", payload, ex.getMessage()); - // fallback 使用普通文本处理 + JsonNode jsonNode = MAPPER.readTree(payload); + JsonNode typeNode = jsonNode.get(AbstractJsonWebSocketMessage.TYPE_FIELD); + + if (typeNode == null) { if (planTextMessageHandler != null) { planTextMessageHandler.handle(session, payload); } @@ -58,46 +55,19 @@ public class CustomWebSocketHandler extends TextWebSocketHandler { log.error("[handleTextMessage] 普通文本消息({})没有对应的消息处理器", payload); } } - - } - - private void handleWithJson(WebSocketSession session, String payload) { - // 消息类型必有一属性type,先解析,获取该属性 - JsonNode jsonNode = null; - try { - jsonNode = MAPPER.readTree(payload); + else { + String messageType = typeNode.asText(); + // 获得对应的消息处理器 + JsonMessageHandler jsonMessageHandler = JsonMessageHandlerHolder.getHandler(messageType); + if (jsonMessageHandler == null) { + log.error("[handleTextMessage] 消息类型({})不存在对应的消息处理器", messageType); + return; + } + // 消息处理 + Class messageClass = jsonMessageHandler.getMessageClass(); + JsonWebSocketMessage websocketMessageJson = MAPPER.treeToValue(jsonNode, messageClass); + jsonMessageHandler.handle(session, websocketMessageJson); } - catch (JsonProcessingException e) { - throw new ErrorJsonMessageException("json 解析异常"); - } - - // 必须是 object 类型 - if (!jsonNode.isObject()) { - throw new ErrorJsonMessageException("json 格式异常!非 object 类型!"); - } - - JsonNode typeNode = jsonNode.get(JsonWebSocketMessage.TYPE_FIELD); - String messageType = typeNode.asText(); - if (messageType == null) { - throw new ErrorJsonMessageException("json 无 type 属性"); - } - - // 获得对应的消息处理器 - JsonMessageHandler jsonMessageHandler = JsonMessageHandlerHolder.getHandler(messageType); - if (jsonMessageHandler == null) { - log.error("[handleTextMessage] 消息类型({})不存在对应的消息处理器", messageType); - return; - } - // 消息处理 - Class messageClass = jsonMessageHandler.getMessageClass(); - JsonWebSocketMessage websocketMessageJson; - try { - websocketMessageJson = MAPPER.treeToValue(jsonNode, messageClass); - } - catch (JsonProcessingException e) { - throw new ErrorJsonMessageException("消息序列化异常,class " + messageClass); - } - jsonMessageHandler.handle(session, websocketMessageJson); } } diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/handler/PingJsonMessageHandler.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/handler/PingJsonMessageHandler.java index 550871b28..aea06792b 100644 --- a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/handler/PingJsonMessageHandler.java +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/handler/PingJsonMessageHandler.java @@ -1,6 +1,6 @@ package com.pig4cloud.pigx.common.websocket.handler; -import com.pig4cloud.pigx.common.websocket.WebSocketMessageSender; +import com.pig4cloud.pigx.common.websocket.config.WebSocketMessageSender; import com.pig4cloud.pigx.common.websocket.message.JsonWebSocketMessage; import com.pig4cloud.pigx.common.websocket.message.PingJsonWebSocketMessage; import com.pig4cloud.pigx.common.websocket.message.PongJsonWebSocketMessage; diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/holder/JsonMessageHandlerHolder.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/holder/JsonMessageHandlerHolder.java index 8fc8f845c..d19ea85bf 100644 --- a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/holder/JsonMessageHandlerHolder.java +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/holder/JsonMessageHandlerHolder.java @@ -1,7 +1,6 @@ package com.pig4cloud.pigx.common.websocket.holder; import com.pig4cloud.pigx.common.websocket.handler.JsonMessageHandler; -import com.pig4cloud.pigx.common.websocket.message.JsonWebSocketMessage; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -15,13 +14,13 @@ public final class JsonMessageHandlerHolder { private JsonMessageHandlerHolder() { } - private static final Map> MESSAGE_HANDLER_MAP = new ConcurrentHashMap<>(); + private static final Map MESSAGE_HANDLER_MAP = new ConcurrentHashMap<>(); - public static JsonMessageHandler getHandler(String type) { + public static JsonMessageHandler getHandler(String type) { return MESSAGE_HANDLER_MAP.get(type); } - public static void addHandler(JsonMessageHandler jsonMessageHandler) { + public static void addHandler(JsonMessageHandler jsonMessageHandler) { MESSAGE_HANDLER_MAP.put(jsonMessageHandler.type(), jsonMessageHandler); } diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/holder/JsonMessageHandlerInitializer.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/holder/JsonMessageHandlerInitializer.java deleted file mode 100644 index 162cac0c3..000000000 --- a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/holder/JsonMessageHandlerInitializer.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.pig4cloud.pigx.common.websocket.holder; - -import com.pig4cloud.pigx.common.websocket.handler.JsonMessageHandler; -import com.pig4cloud.pigx.common.websocket.message.JsonWebSocketMessage; -import lombok.RequiredArgsConstructor; - -import javax.annotation.PostConstruct; -import java.util.List; - -/** - *

- * JsonMessageHandler 初始化器 - *

- * 将所有的 jsonMessageHandler 收集到 JsonMessageHandlerHolder 中 - * - * @author Hccake - */ -@RequiredArgsConstructor -public class JsonMessageHandlerInitializer { - - private final List> jsonMessageHandlerList; - - @SuppressWarnings("unchecked") - @PostConstruct - public void initJsonMessageHandlerHolder() { - for (JsonMessageHandler jsonMessageHandler : jsonMessageHandlerList) { - JsonMessageHandlerHolder.addHandler((JsonMessageHandler) jsonMessageHandler); - } - } - -} \ No newline at end of file diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/holder/MapSessionWebSocketHandlerDecorator.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/holder/MapSessionWebSocketHandlerDecorator.java new file mode 100644 index 000000000..74c3ac43d --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/holder/MapSessionWebSocketHandlerDecorator.java @@ -0,0 +1,46 @@ +package com.pig4cloud.pigx.common.websocket.holder; + +import org.springframework.web.socket.CloseStatus; +import org.springframework.web.socket.WebSocketHandler; +import org.springframework.web.socket.WebSocketSession; +import org.springframework.web.socket.handler.WebSocketHandlerDecorator; + +/** + * WebSocketHandler 装饰器,该装饰器主要用于在开启和关闭连接时,进行session的映射存储与释放 + * + * @author Hccake 2020/12/31 + * @version 1.0 + */ +public class MapSessionWebSocketHandlerDecorator extends WebSocketHandlerDecorator { + + private final SessionKeyGenerator sessionKeyGenerator; + + public MapSessionWebSocketHandlerDecorator(WebSocketHandler delegate, SessionKeyGenerator sessionKeyGenerator) { + super(delegate); + this.sessionKeyGenerator = sessionKeyGenerator; + } + + /** + * websocket 连接时执行的动作 + * @param session websocket session 对象 + * @throws Exception 异常对象 + */ + @Override + public void afterConnectionEstablished(final WebSocketSession session) throws Exception { + Object sessionKey = sessionKeyGenerator.sessionKey(session); + WebSocketSessionHolder.addSession(sessionKey, session); + } + + /** + * websocket 关闭连接时执行的动作 + * @param session websocket session 对象 + * @param closeStatus 关闭状态对象 + * @throws Exception 异常对象 + */ + @Override + public void afterConnectionClosed(final WebSocketSession session, CloseStatus closeStatus) throws Exception { + Object sessionKey = sessionKeyGenerator.sessionKey(session); + WebSocketSessionHolder.removeSession(sessionKey); + } + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/session/SessionKeyGenerator.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/holder/SessionKeyGenerator.java similarity index 87% rename from pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/session/SessionKeyGenerator.java rename to pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/holder/SessionKeyGenerator.java index d29e7c91e..bccb5dd3c 100644 --- a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/session/SessionKeyGenerator.java +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/holder/SessionKeyGenerator.java @@ -1,4 +1,4 @@ -package com.pig4cloud.pigx.common.websocket.session; +package com.pig4cloud.pigx.common.websocket.holder; import org.springframework.web.socket.WebSocketSession; diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/holder/WebSocketSessionHolder.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/holder/WebSocketSessionHolder.java new file mode 100644 index 000000000..f6802e9da --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/holder/WebSocketSessionHolder.java @@ -0,0 +1,65 @@ +package com.pig4cloud.pigx.common.websocket.holder; + +import org.springframework.web.socket.WebSocketSession; + +import java.util.Collection; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +/** + * WebSocketSession 持有者 主要用于保存当前所有在线的会话信息 + * + * @author Hccake 2021/1/4 + * @version 1.0 + */ +public final class WebSocketSessionHolder { + + private WebSocketSessionHolder() { + } + + private static final Map USER_SESSION_MAP = new ConcurrentHashMap<>(); + + /** + * 添加一个 session + * @param sessionKey session 唯一标识 + * @param session 待添加的 WebSocketSession + */ + public static void addSession(Object sessionKey, WebSocketSession session) { + USER_SESSION_MAP.put(sessionKey.toString(), session); + } + + /** + * 删除一个 session + * @param sessionKey session唯一标识 + */ + public static void removeSession(Object sessionKey) { + USER_SESSION_MAP.remove(sessionKey.toString()); + } + + /** + * 获取指定标识的 session + * @param sessionKey session唯一标识 + * @return WebSocketSession 该标识对应的 session + */ + public static WebSocketSession getSession(Object sessionKey) { + return USER_SESSION_MAP.get(sessionKey.toString()); + } + + /** + * 获取当前所有在线的 session + * @return Collection session集合 + */ + public static Collection getSessions() { + return USER_SESSION_MAP.values(); + } + + /** + * 获取所有在线的用户标识 + * @return Set session唯一标识集合 + */ + public static Set getSessionKeys() { + return USER_SESSION_MAP.keySet(); + } + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/message/AbstractJsonWebSocketMessage.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/message/AbstractJsonWebSocketMessage.java new file mode 100644 index 000000000..25b340859 --- /dev/null +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/message/AbstractJsonWebSocketMessage.java @@ -0,0 +1,22 @@ +package com.pig4cloud.pigx.common.websocket.message; + +/** + * @author Hccake 2021/1/4 + * @version 1.0 + */ +public abstract class AbstractJsonWebSocketMessage implements JsonWebSocketMessage { + + public static final String TYPE_FIELD = "type"; + + private final String type; + + protected AbstractJsonWebSocketMessage(String type) { + this.type = type; + } + + @Override + public String getType() { + return type; + } + +} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/message/JsonWebSocketMessage.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/message/JsonWebSocketMessage.java index 47fa235ed..4cfdc951f 100644 --- a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/message/JsonWebSocketMessage.java +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/message/JsonWebSocketMessage.java @@ -4,19 +4,12 @@ package com.pig4cloud.pigx.common.websocket.message; * @author Hccake 2021/1/4 * @version 1.0 */ -@SuppressWarnings("AlibabaAbstractClassShouldStartWithAbstractNaming") -public abstract class JsonWebSocketMessage { +public interface JsonWebSocketMessage { - public static final String TYPE_FIELD = "type"; - - private final String type; - - protected JsonWebSocketMessage(String type) { - this.type = type; - } - - public String getType() { - return type; - } + /** + * 消息类型,主要用于匹配对应的消息处理器 + * @return 当前消息类型 + */ + String getType(); } diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/message/PingJsonWebSocketMessage.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/message/PingJsonWebSocketMessage.java index 41c52814f..1faf12689 100644 --- a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/message/PingJsonWebSocketMessage.java +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/message/PingJsonWebSocketMessage.java @@ -4,7 +4,7 @@ package com.pig4cloud.pigx.common.websocket.message; * @author Hccake 2021/1/4 * @version 1.0 */ -public class PingJsonWebSocketMessage extends JsonWebSocketMessage { +public class PingJsonWebSocketMessage extends AbstractJsonWebSocketMessage { public PingJsonWebSocketMessage() { super(WebSocketMessageTypeEnum.PING.getValue()); diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/message/PongJsonWebSocketMessage.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/message/PongJsonWebSocketMessage.java index 1e8e150b2..02f5c3432 100644 --- a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/message/PongJsonWebSocketMessage.java +++ b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/message/PongJsonWebSocketMessage.java @@ -4,7 +4,7 @@ package com.pig4cloud.pigx.common.websocket.message; * @author Hccake 2021/1/4 * @version 1.0 */ -public class PongJsonWebSocketMessage extends JsonWebSocketMessage { +public class PongJsonWebSocketMessage extends AbstractJsonWebSocketMessage { public PongJsonWebSocketMessage() { super(WebSocketMessageTypeEnum.PONG.getValue()); diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/session/DefaultWebSocketSessionStore.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/session/DefaultWebSocketSessionStore.java deleted file mode 100644 index 2c32282a6..000000000 --- a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/session/DefaultWebSocketSessionStore.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.pig4cloud.pigx.common.websocket.session; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.socket.WebSocketSession; - -import java.util.Collection; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Collectors; - -/** - * 默认的 WebSocketSession 存储器 - * - * @author hccake - */ -@Slf4j -public class DefaultWebSocketSessionStore implements WebSocketSessionStore { - - private final SessionKeyGenerator sessionKeyGenerator; - - private final ConcurrentHashMap> sessionKeyToWsSessions = new ConcurrentHashMap<>(); - - public DefaultWebSocketSessionStore(SessionKeyGenerator sessionKeyGenerator) { - this.sessionKeyGenerator = sessionKeyGenerator; - } - - /** - * 添加一个 wsSession - * @param wsSession 待添加的 WebSocketSession - */ - @Override - public void addSession(WebSocketSession wsSession) { - Object sessionKey = sessionKeyGenerator.sessionKey(wsSession); - Map sessions = this.sessionKeyToWsSessions.get(sessionKey); - if (sessions == null) { - sessions = new ConcurrentHashMap<>(); - this.sessionKeyToWsSessions.putIfAbsent(sessionKey, sessions); - sessions = this.sessionKeyToWsSessions.get(sessionKey); - } - sessions.put(wsSession.getId(), wsSession); - } - - /** - * 删除一个 session - * @param session WebSocketSession - */ - @Override - public void removeSession(WebSocketSession session) { - Object sessionKey = sessionKeyGenerator.sessionKey(session); - String wsSessionId = session.getId(); - - Map sessions = this.sessionKeyToWsSessions.get(sessionKey); - if (sessions != null) { - boolean result = sessions.remove(wsSessionId) != null; - if (log.isDebugEnabled()) { - log.debug("Removal of " + wsSessionId + " was " + result); - } - if (sessions.isEmpty()) { - this.sessionKeyToWsSessions.remove(sessionKey); - if (log.isDebugEnabled()) { - log.debug("Removed the corresponding HTTP Session for " + wsSessionId - + " since it contained no WebSocket mappings"); - } - } - } - } - - /** - * 获取当前所有在线的 session - * @return Collection session集合 - */ - @Override - public Collection getSessions() { - return sessionKeyToWsSessions.values().stream().flatMap(x -> x.values().stream()).collect(Collectors.toList()); - } - - /** - * 根据指定的 sessionKey 获取对应的 wsSessions - * @param sessionKey wsSession 标识 - * @return Collection websocket session集合 - */ - @Override - public Collection getSessions(Object sessionKey) { - return sessionKeyToWsSessions.get(sessionKey).values(); - } - - /** - * 获取所有的 sessionKeys - * @return sessionKey 集合 - */ - @Override - public Collection getSessionKeys() { - return sessionKeyToWsSessions.keySet(); - } - -} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/session/MapSessionWebSocketHandlerDecorator.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/session/MapSessionWebSocketHandlerDecorator.java deleted file mode 100644 index ba7880450..000000000 --- a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/session/MapSessionWebSocketHandlerDecorator.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.pig4cloud.pigx.common.websocket.session; - -import com.pig4cloud.pigx.common.websocket.handler.ConcurrentWebSocketSessionOptions; -import org.springframework.web.socket.CloseStatus; -import org.springframework.web.socket.WebSocketHandler; -import org.springframework.web.socket.WebSocketSession; -import org.springframework.web.socket.handler.ConcurrentWebSocketSessionDecorator; -import org.springframework.web.socket.handler.WebSocketHandlerDecorator; - -/** - * WebSocketHandler 装饰器,该装饰器主要用于在开启和关闭连接时,进行session的映射存储与释放 - * - * @author Hccake 2020/12/31 - * @version 1.0 - */ -public class MapSessionWebSocketHandlerDecorator extends WebSocketHandlerDecorator { - - private final WebSocketSessionStore webSocketSessionStore; - - private final ConcurrentWebSocketSessionOptions concurrentWebSocketSessionOptions; - - public MapSessionWebSocketHandlerDecorator(WebSocketHandler delegate, WebSocketSessionStore webSocketSessionStore, - ConcurrentWebSocketSessionOptions concurrentWebSocketSessionOptions) { - super(delegate); - this.webSocketSessionStore = webSocketSessionStore; - this.concurrentWebSocketSessionOptions = concurrentWebSocketSessionOptions; - } - - /** - * websocket 连接时执行的动作 - * @param wsSession websocket session 对象 - * @throws Exception 异常对象 - */ - @Override - public void afterConnectionEstablished(WebSocketSession wsSession) throws Exception { - // 包装一层,防止并发发送出现问题 - if (Boolean.TRUE.equals(concurrentWebSocketSessionOptions.isEnable())) { - wsSession = new ConcurrentWebSocketSessionDecorator(wsSession, - concurrentWebSocketSessionOptions.getSendTimeLimit(), - concurrentWebSocketSessionOptions.getBufferSizeLimit(), - concurrentWebSocketSessionOptions.getOverflowStrategy()); - } - webSocketSessionStore.addSession(wsSession); - } - - /** - * websocket 关闭连接时执行的动作 - * @param wsSession websocket session 对象 - * @param closeStatus 关闭状态对象 - * @throws Exception 异常对象 - */ - @Override - public void afterConnectionClosed(WebSocketSession wsSession, CloseStatus closeStatus) throws Exception { - webSocketSessionStore.removeSession(wsSession); - } - -} diff --git a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/session/WebSocketSessionStore.java b/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/session/WebSocketSessionStore.java deleted file mode 100644 index 3e906c961..000000000 --- a/pigx-common/pigx-common-websocket/src/main/java/com/pig4cloud/pigx/common/websocket/session/WebSocketSessionStore.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.pig4cloud.pigx.common.websocket.session; - -import org.springframework.web.socket.WebSocketSession; - -import java.util.Collection; - -/** - * @author hccake - */ -public interface WebSocketSessionStore { - - /** - * 添加一个 session - * @param session 待添加的 WebSocketSession - */ - void addSession(WebSocketSession session); - - /** - * 删除一个 session - * @param session WebSocketSession - */ - void removeSession(WebSocketSession session); - - /** - * 获取当前所有在线的 wsSessions - * @return Collection websocket session集合 - */ - Collection getSessions(); - - /** - * 根据指定的 sessionKey 获取对应的 wsSessions - * @param sessionKey wsSession 标识 - * @return Collection websocket session集合 - */ - Collection getSessions(Object sessionKey); - - /** - * 获取所有的 sessionKeys - * @return sessionKey 集合 - */ - Collection getSessionKeys(); - -} diff --git a/pigx-common/pigx-common-websocket/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/pigx-common/pigx-common-websocket/src/main/resources/META-INF/additional-spring-configuration-metadata.json deleted file mode 100644 index 9824783bb..000000000 --- a/pigx-common/pigx-common-websocket/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "properties": [ - { - "name": "ballcat.websocket.concurrent.buffer-size-limit", - "type": "java.lang.Integer", - "sourceType": "com.pig4cloud.pigx.common.websocket.handler.ConcurrentWebSocketSessionOptions", - "description": "发送消息缓冲上限 (byte)", - "defaultValue": 102400 - }, - { - "name": "ballcat.websocket.concurrent.enable", - "type": "java.lang.Boolean", - "sourceType": "com.pig4cloud.pigx.common.websocket.handler.ConcurrentWebSocketSessionOptions", - "description": "是否在多线程环境下进行发送", - "defaultValue": false - }, - { - "name": "ballcat.websocket.concurrent.overflow-strategy", - "type": "org.springframework.web.socket.handler.ConcurrentWebSocketSessionDecorator$OverflowStrategy", - "sourceType": "com.pig4cloud.pigx.common.websocket.handler.ConcurrentWebSocketSessionOptions", - "description": "缓冲区溢出时的执行策略", - "defaultValue": "org.springframework.web.socket.handler.ConcurrentWebSocketSessionDecorator.OverflowStrategy.TERMINATE" - }, - { - "name": "ballcat.websocket.concurrent.send-time-limit", - "type": "java.lang.Integer", - "sourceType": "com.pig4cloud.pigx.common.websocket.handler.ConcurrentWebSocketSessionOptions", - "description": "发送时间的限制(ms)", - "defaultValue": 5000 - } - ] -} \ No newline at end of file diff --git a/pigx-common/pigx-common-websocket/src/main/resources/META-INF/spring.factories b/pigx-common/pigx-common-websocket/src/main/resources/META-INF/spring.factories index 6b43c96c6..ddaf06a0c 100644 --- a/pigx-common/pigx-common-websocket/src/main/resources/META-INF/spring.factories +++ b/pigx-common/pigx-common-websocket/src/main/resources/META-INF/spring.factories @@ -1,2 +1,4 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ - com.pig4cloud.pigx.common.websocket.config.WebSocketAutoConfiguration \ No newline at end of file + com.pig4cloud.pigx.common.websocket.config.WebSocketAutoConfiguration,\ + com.pig4cloud.pigx.common.websocket.config.RedisMessageDistributorConfiguration,\ + com.pig4cloud.pigx.common.websocket.config.LocalMessageDistributorConfiguration