package com.qianwen.core.websocket.distribute; import cn.hutool.json.JSONUtil; import java.util.List; import java.util.Properties; import java.util.stream.Collectors; import com.qianwen.core.tool.utils.Func; import com.qianwen.core.tool.utils.SpringUtil; import com.qianwen.core.websocket.config.ServerConfig; import org.springframework.cloud.client.ServiceInstance; import org.springframework.data.redis.core.StringRedisTemplate; public class RedisMessageDistributor implements MessageDistributor { private final StringRedisTemplate stringRedisTemplate; public RedisMessageDistributor(final StringRedisTemplate stringRedisTemplate) { this.stringRedisTemplate = stringRedisTemplate; } @Override public void distribute(MessageDO messageDO) { String host; int port; Properties props = System.getProperties(); String appName = props.getProperty("spring.application.name"); String channel = Func.isNotEmpty(appName) ? RedisWebsocketMessageListener.CHANNEL.concat("-").concat(appName) : RedisWebsocketMessageListener.CHANNEL; ServiceInstance instance = null; try { instance = (ServiceInstance) SpringUtil.getBean(ServiceInstance.class); } catch (Exception e) { } if (Func.isEmpty(instance)) { port = ((ServerConfig) SpringUtil.getBean(ServerConfig.class)).getServerPort(); host = ((ServerConfig) SpringUtil.getBean(ServerConfig.class)).getHost(); } else { host = instance.getHost(); port = instance.getPort(); } if (Func.isNotEmpty(messageDO.getSessionKeys())) { String str = host; int i = port; List sessionKeyList = messageDO.getSessionKeys().stream().map(key -> { return String.format("%s:%s:%s", str, Integer.valueOf(i), key); }).collect(Collectors.toList()); messageDO.setSessionKeys(sessionKeyList); } String str2 = JSONUtil.toJsonStr(messageDO); this.stringRedisTemplate.convertAndSend(channel, str2); } }