java多服务推送websocket

场景:在使用多个服务使用一个websocket地址进行推送,这里使用redis订阅发布来实现。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>

websocket使用

@Slf4j
@ServerEndpoint(value = "/ws/alarm")
@Component
public class BaseWebSocket {
    private static ConcurrentHashMap<String, BaseWebSocket> webSocketSet = new ConcurrentHashMap<String, BaseWebSocket>();
    private Session session;
    //uid
    private String uid = "";

    @OnOpen
    public void onOpen(Session session) {
        String param=session.getQueryString();
        if(StringUtils.isBlank(param)){
            return;
        }
        if(param.contains("uid=")){
            String[] split = param.split("=");
            this.uid= split[1];
            this.session = session;
            webSocketSet.put(session.getId(), this);//加入map中
        }
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose(Session session) {
        String sid = session.getId();
        if (StringUtils.isNotBlank(sid)) {
            webSocketSet.remove(sid);
        }
    }

    /**
     * 收到客户端消息后调用的方法
     *
     * @param message 客户端发送过来的消息
     * @param session 可选的参数
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        log.info("来自客户端的消息:" + message);
    }

    @Autowired
    SysUserManageService sysUserManageService;

    /**
     * @param message
     */
    public void sendToUser(String message) {
        for(String sid:webSocketSet.keySet()){
            sendUserById(message, sid);
        }
    }


    private void sendUserById(String message,String uid){
        try {
            if (webSocketSet.get(uid) != null) {
                webSocketSet.get(uid).sendMessage(message,webSocketSet.get(uid));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 发消息
     */
    public void sendAll(String message) {
            sendUserById(message, id);
    }


    @OnError
    public void onError(Session session, Throwable error) {
        error.printStackTrace();
    }

    public void sendMessage(String message,BaseWebSocket webSocketSet) throws IOException {
        synchronized (webSocketSet.session) {
            webSocketSet.session.getBasicRemote().sendText(message);
        }
    }

使用

@Autowired
BaseWebSocket baseWebSocket;       

baseWebSocket.sendToUser(String);

多服务中

websocket服务端

@Configuration
public class MsgListenerConfig extends CachingConfigurerSupport {

    /**
     * 消息监听容器
     */
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory factory){
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(factory);
        //订阅一个通道 该处的通道名是发布消息时的名称
        container.addMessageListener(msgAdapter(),new PatternTopic("appMsg"));
        return container;
    }

    /**
     * 消息监听适配器,绑定消息处理器
     */
    @Bean
    MessageListenerAdapter msgAdapter(){
        return new MessageListenerAdapter(new MsgListener());
    }

}
@Component
@Slf4j
public class MsgListener implements MessageListener {
    
    
    @Autowired
    BaseWebSocket baseWebSocket;

    @Override
    public void onMessage(Message message, byte[] bytes) {
        log.info("appMsg:" + message.toString());
        if(baseWebSocket==null){
            baseWebSocket=SpringContextUtil.getBean(BaseWebSocket.class);
        }
        baseWebSocket.sendToUser(message.toString());
    }
}

其他服务端

		
@Autowired
StringRedisTemplate stringRedisTemplate;


stringRedisTemplate.convertAndSend("appMsg", "str");

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暮雪...

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值