问题描述
我正在尝试使用 SSE 向连接的客户端发送消息。
我已将 SseEmitter 对象保存在 redis 中,以便我可以获取相同的对象并将消息发送给客户端。
但是,消息没有发送到客户端。
当我用一个简单的列表进行测试时,它工作正常。但是,当我有多个客户端时,我需要存储各个客户端的连接信息并发送消息。但是,没有发送消息。
我有一个带有 2 个端点的控制器类,/subscribe/{userId] 用于订阅 SSE 消息和 另一个 dispatchEvent 将消息从服务器推送到客户端。
@CrossOrigin
@RequestMapping(value="subscribe/{userId}",consumes=MediaType.ALL_VALUE)
public SSEInfo subscribe(@PathVariable("userId") String userId) {
SSEInfo sseEmitter=new SSEInfo(Long.MAX_VALUE);
try {
sseEmitter.send(SseEmitter.event().name("INIT"));
sseRedisService.save(userId,sseEmitter);
}catch(IOException e) {
e.printstacktrace();
}
sseEmitter.onCompletion( () -> sseRedisService.deleteById(userId));
sseRedisService.save(userId,sseEmitter);
return sseEmitter;
}
在我的 dispatchEvent 处理程序中,我有以下内容,
@PostMapping(value="dispatchEvent")
public void dispatchEventsToAllClients(@RequestParam String event,@RequestParam String userId) {
try {
SSEInfo sseEmitter=(SSEInfo) sseRedisService.findById(userId);
sseEmitter.send(SseEmitter.event().name("event").data(event));
} catch (IOException e) {
e.printstacktrace();
sseRedisService.deleteById(userId);
}
}
在我的服务类 SSERedisService 的 sseRedisService 对象内部,我使用的是 Spring 数据 redis ,
redistemplate.opsForValue().set(userId,object); to save in redis cache.
为了获取,我使用,
redistemplate.opsForValue().get(userId);
但是,当我调用 dispatch 事件时,消息没有发送到客户端。
我通过创建扩展 SseEmitter 并实现 Serializable 的自定义类 SSEInfo 来包装 SseEmitter。
我使用以下 CURL 请求,
curl http://localhost:8085/subscribe/user001
curl -d "event=teeuser&userId=user001" -X POST http://localhost:8085/dispatchEvent
用于相应地订阅和分派事件。
有人能帮我解决这个问题吗?我不确定我们是否可以将 sseEmitter 对象保存到 redis 并再次获取它们以发送回客户端。
完整的源代码也可以在 github repo 中找到,如下所示,
https://github.com/sri420/SSE-Redis
有人可以帮忙解决这个问题。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)