feat(sse): 优化SSE模块配置与文档

- 重命名messageDistributor为sseMessageDistributor以明确功能定位
- 为SseEmitterEndpoint添加详细方法注释说明
- 优化RedisMessageDistributorConfiguration类结构与文档
- 更新SseEmitterMessageSender类文档与日期信息
- 为MessageDistributorTypeConstants添加类说明文档
This commit is contained in:
PIG AI committed 2025-06-23 16:18:14 +08:00
1 parent 718a587c19
commit 9601609eb2
7 files changed
+83 -16

No files matched your search

@@ -23,7 +23,7 @@ public class LocalMessageDistributorConfiguration {
*/
@Bean
@ConditionalOnMissingBean(MessageDistributor.class)
public LocalMessageDistributor messageDistributor() {
public LocalMessageDistributor sseMessageDistributor() {
return new LocalMessageDistributor();
}
@@ -1,7 +1,10 @@
package com.pig4cloud.pigx.common.sse.config;
/**
* 消息分发器类型常量类
*
* @author lengleng
* @date 2025/06/06
*/
public final class MessageDistributorTypeConstants {
@@ -27,32 +27,61 @@ import org.springframework.data.redis.listener.RedisMessageListenerContainer;
@Configuration(proxyBeanMethods = false)
public class RedisMessageDistributorConfiguration {
/**
* 创建Redis消息分发器Bean
*
* @param stringRedisTemplate Redis字符串模板
* @return Redis消息分发器实例
* @ConditionalOnMissingBean 当容器中不存在MessageDistributor类型的Bean时创建
*/
@Bean
@ConditionalOnMissingBean(MessageDistributor.class)
public RedisMessageDistributor messageDistributor(StringRedisTemplate stringRedisTemplate) {
public RedisMessageDistributor sseMessageDistributor(StringRedisTemplate stringRedisTemplate) {
return new RedisMessageDistributor(stringRedisTemplate);
}
}
/**
* 创建RedisSseEmitterMessageListener实例
*
* @param stringRedisTemplate Redis字符串模板
* @return RedisSseEmitterMessageListener实例
* @see RedisSseEmitterMessageListener
*/
@Bean
@ConditionalOnBean(RedisMessageDistributor.class)
@ConditionalOnMissingBean
public RedisSseEmitterMessageListener redisWebsocketMessageListener(StringRedisTemplate stringRedisTemplate) {
public RedisSseEmitterMessageListener sseRedisWebsocketMessageListener(StringRedisTemplate stringRedisTemplate) {
return new RedisSseEmitterMessageListener(stringRedisTemplate);
}
}
/**
* 创建Redis消息监听容器
*
* @param connectionFactory Redis连接工厂
* @return Redis消息监听容器实例
* @see RedisMessageListenerContainer
*/
@Bean
@ConditionalOnBean(RedisMessageDistributor.class)
@ConditionalOnMissingBean
public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory) {
public RedisMessageListenerContainer sseRedisMessageListenerContainer(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
return container;
}
}
/**
* SSE Redis消息监听器注册配置类
* <p>
* 用于配置Redis消息监听器,实现SSE消息分发
*
* @author lengleng
* @date 2025/06/06
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnMissingBean(MessageDistributor.class)
@RequiredArgsConstructor
static class RedisMessageListenerRegisterConfiguration {
static class SseRedisMessageListenerRegisterConfiguration {
private final RedisMessageListenerContainer redisMessageListenerContainer;
@@ -12,6 +12,12 @@ import org.springframework.context.annotation.Bean;
@EnableConfigurationProperties(SseEmitterProperties.class)
public class SseEmitterAutoConfiguration {
/**
* 创建并返回一个SseEmitterEndpoint实例
*
* @return SseEmitterEndpoint实例
* @ConditionalOnMissingBean 当容器中不存在该类型的bean时才会创建
*/
@Bean
@ConditionalOnMissingBean
public SseEmitterEndpoint sseEmitterEndpoint() {
@@ -12,8 +12,10 @@ import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import java.util.Objects;
/**
* SSE端点控制器:提供服务器发送事件(SSE)功能
*
* @author lengleng
* @date 2023/12/11
* @date 2025/06/06
*/
@Slf4j
@RestController
@@ -21,6 +23,12 @@ import java.util.Objects;
@RequestMapping("/sse")
public class SseEmitterEndpoint {
/**
* 创建并返回一个SSE事件发射器
*
* @return SSE事件发射器,用于服务器推送事件,若用户未认证则返回null
* @throws Exception 若发送初始消息失败时抛出异常
*/
@SneakyThrows
@RequestMapping("/info")
public SseEmitter info() {
@@ -8,19 +8,34 @@ import java.io.IOException;
import java.util.Collection;
/**
* @author lengleng 2021/1/4
* SSE消息发送工具类,提供广播和单播消息发送功能
*
* @author lengleng
* @version 1.0
* @date 2025/06/06
*/
@Slf4j
public class SseEmitterMessageSender {
/**
* 广播消息给所有SSE订阅者
*
* @param message 要广播的消息内容
*/
public static void broadcast(String message) {
Collection<SseEmitter> sseEmitters = SseEmitterHolder.getSseEmitters();
for (SseEmitter sseEmitter : sseEmitters) {
send(sseEmitter, message);
}
}
}
}
/**
* 发送消息到指定的SSE连接
*
* @param sseEmitterKey SSE连接标识键
* @param message 要发送的消息内容
* @return 发送是否成功
*/
public static boolean send(Object sseEmitterKey, String message) {
SseEmitter sseEmitter = SseEmitterHolder.getSseEmitter(sseEmitterKey);
if (sseEmitter == null) {
@@ -29,9 +44,16 @@ public class SseEmitterMessageSender {
}
else {
return send(sseEmitter, message);
}
}
}
}
/**
* 发送消息到SSE连接
*
* @param sseEmitter SSE连接对象
* @param message 要发送的消息内容
* @return 发送成功返回true,失败返回false
*/
public static boolean send(SseEmitter sseEmitter, String message) {
if (sseEmitter == null) {
log.error("[send] sseEmitter 为 null");
@@ -15,8 +15,7 @@ public class SseEmitterProperties {
public static final String PREFIX = "pigx.sse";
/**
* 路径: 无参: /ws 有参: PathVariable: 单参: /ws/{test} 多参: /ws/{test1}/{test2} query:
* /ws?uid=1&name=test
* SSE信息路径
*/
private String path = "/sse/info";