• 记一次LinkedBlockingQueue的使用并且发送socket


    package cn.xs.qishi.socket.standalone.queue;
    
    import cn.xs.qishi.cache.dto.topic.StatSendMsg;
    import cn.xs.qishi.socket.standalone.session.StatSocketSessionManager;
    import lombok.CustomLog;
    
    import javax.websocket.EncodeException;
    import javax.websocket.RemoteEndpoint;
    import javax.websocket.Session;
    import java.io.IOException;
    import java.util.List;
    import java.util.concurrent.LinkedBlockingQueue;
    
    /**
     * 统计阻塞对了
     *
     * @author liuxn
     * @date 2022/6/23
     */
    @CustomLog
    public class StatTopicHandler {
    
    
        private static StatTopicHandler handler = null;
        private static LinkedBlockingQueue<StatSendMsg> queue = new LinkedBlockingQueue();
        private StatSocketSessionManager sessionManager;
    
    
        public static StatTopicHandler getInstance() {
            if (handler == null) {
                handler = new StatTopicHandler();
            }
            return handler;
        }
    
        public void setSessionManager(StatSocketSessionManager sessionManager) {
            this.sessionManager = sessionManager;
        }
    
        public StatTopicHandler() {
            Thread thread = new Thread(new StatQueueThread());
            thread.setName("stat_redis_topic_consumer");
            thread.start();
            log.info(">> 业务统计阻塞队列监听启动完毕 !!!");
        }
    
        public void put(StatSendMsg msg) {
            try {
                queue.put(msg);
            } catch (InterruptedException e) {
                log.error(">> 统计消息放入阻塞队列异常", e);
            }
        }
    
    
        class StatQueueThread implements Runnable {
    
            private boolean isRun = true;
    
            @Override
            public void run() {
                while (isRun) {
                    try {
                        StatSendMsg msg = queue.take();
                        long userId = msg.getUserId();
                        String msgId = msg.getMsgId();
                        List<Session> list = sessionManager.user(userId);
                        int sent = 0;
                        log.info(">> 阻塞队列中 redis topic 消息:" + msgId);
                        for (Session session : list) {
                            try {
                                RemoteEndpoint.Basic basicRemote = session.getBasicRemote();
                                basicRemote.sendObject(msg);
                                String sessionId = session.getId();
                                log.info(">> Sent stat msg to client.sessionId:{},msgId:{},userId:{}", sessionId, msgId, userId);
                                sent++;
                            } catch (IOException | EncodeException e) {
                                log.error("发送消息异常", e);
                                if (!session.isOpen()) {
                                    sessionManager.remove(session, userId);
                                }
                            }
                        }
                        if (sent == 0) {
                            log.info(">> Sent stat msg to client fail. no client userid:[{}]", userId);
                        }
                    } catch (InterruptedException e) {
                        log.error(">>阻塞队列 监听异常", e);
                    }
                }
            }
    
            public void stop() {
                isRun = false;
            }
        }
    
    
    }
    

      

  • 相关阅读:
    HTML的基本知识
    java script后续
    java script
    CSS
    DAY 33 进程理论与进程方法
    DAY 32 UDP协议、Socketserver模块,并发编程基础
    DAY 30 网络编程基础
    DAY 25多态、反射、异常处理
    DAY 24继承与组合
    DAY 23 面向对象(二)
  • 原文地址:https://www.cnblogs.com/lxn0216/p/16407135.html
Copyright © 2020-2023  润新知