soul从入门到放弃5--浅析websocket数据同步(一)

2021-01-19  本文已影响0人  滴流乱转的小胖子

零、前戏

最近在“玩”demo的过程中,就一直好奇。插件信息等元数据,soul是怎么从soul-admin同步到soul-bootstrap中的。

本着大胆瞎猜,小心求证的心态,就有今天的关于websocket这篇文章。

一、服务端--soul-admin

猜测:服务端实现是在写在soul-admin项目内部

image

涉及websocket的配置初始化代码如下:

image

与yml中的配置项对应

image image

@ServerEndpoint("/websocket")科普帖子:https://blog.csdn.net/weixin_39793752/article/details/80949128

@ServerEndpoint("/websocket")
public class WebsocketCollector {
    private static final Set<Session> SESSION_SET = new CopyOnWriteArraySet<>();
    private static final String SESSION_KEY = "sessionKey";
    /**
     * On open.
     *
     * @param session the session
     */
    @OnOpen
    public void onOpen(final Session session) {
        log.info("websocket on open successful....");
        SESSION_SET.add(session);
    }
    /**
     * On message.
     * 
     * @param message the message
     * @param session the session
     */
    @OnMessage
    public void onMessage(final String message, final Session session) {
        if (message.equals(DataEventTypeEnum.MYSELF.name())) {
            try {
                ThreadLocalUtil.put(SESSION_KEY, session);
                SpringBeanUtils.getInstance().getBean(SyncDataService.class).syncAll(DataEventTypeEnum.MYSELF);
            } finally {
                ThreadLocalUtil.clear();
            }
        }
    }
    /**
     * On close.
     *
     * @param session the session
     */
    @OnClose
    public void onClose(final Session session) {
        SESSION_SET.remove(session);
        ThreadLocalUtil.clear();
    }
    /**
     * On error.
     *
     * @param session the session
     * @param error   the error
     */
    @OnError
    public void onError(final Session session, final Throwable error) {
        SESSION_SET.remove(session);
        ThreadLocalUtil.clear();
        log.error("websocket collection error: ", error);
    }
    /**
     * Send.
     *
     * @param message the message
     * @param type    the type
     */
    public static void send(final String message, final DataEventTypeEnum type) {
        if (StringUtils.isNotBlank(message)) {
            if (DataEventTypeEnum.MYSELF == type) {
                try {
                    Session session = (Session) ThreadLocalUtil.get(SESSION_KEY);
                    if (session != null) {
                        session.getBasicRemote().sendText(message);
                    }
                } catch (IOException e) {
                    log.error("websocket send result is exception: ", e);
                }
                return;
            }
            for (Session session : SESSION_SET) {
                try {
                    session.getBasicRemote().sendText(message);
                } catch (IOException e) {
                    log.error("websocket send result is exception: ", e);
                }
            }
        }
    }
}

@OnOpen:连接建立成功调用的方法

@OnClose:连接关闭调用方法

@OnMessage:收到客户端消息后调用的方法

@OnError:发送错误时调用

详细机制此处暂留坑,后文再续

image

二、客户端--soul-bootstrap

从pom文件入手,找到了soul-spring-boot-starter-sync-data-websocket中的WebsocketSyncDataConfiguration类

image image image

线程池科普贴:https://blog.csdn.net/weixin_35756522/article/details/81707276

public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit);

command:执行线程

initialDelay:初始化延时

period:两次开始执行最小间隔时间

unit:计时单位

image

小结:

上一篇下一篇

猜你喜欢

热点阅读