前景提要
最近一个项目,启动了两个Springboot服务一个服务用来接收tcp数据,一个用来处理前端请求。所以将处理前端SSE连接功能放在第二个服务中,但是第一个服务需要调用SSE给全体客户端发送消息的功能。
问题描述
首先SSE连接对象存储在服务二的类变量中,因为JVM不同当服务一调用接口的时候访问不到该类变量拿不到连接对象无法推送消息给前端,本来想通过redis存储连接对象但是SSE对象不能序列化存储后取出不是同一对象。此办法不通只能找别的方法。
问题解决
后来使用了redis的消息队列功能,使用redis通过对通道的消息监听。服务2发送消息到预设通道,监听后再使用SSE发送消息功能。问题暂时解决。
后来还发现问题偶尔可以偶尔又获取不到连接,又琢磨了一会发现先启动服务2后启动服务1都没问题。可能是和SpringBoot单例模式有关联。
结尾
没在实际的分布式环境是使用过,不知道是否可行。