shikeyin
2024-01-11 65da8373531677b1c37a98f53eaa30c892f35e5a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
package com.iplatform.tcp.config;
 
import com.iplatform.base.config.TcpProperties;
import com.iplatform.core.config.LoadBalanceProperties;
import com.iplatform.tcp.EngineType;
import com.iplatform.tcp.support.TestConnectionCallback;
import com.iplatform.tcp.support.WebSocketPush;
import com.iplatform.tcp.util.ws.LoginAction;
import com.walker.infrastructure.ApplicationRuntimeException;
import com.walker.push.PushManager;
import com.walker.push.Pushable;
import com.walker.queue.QueueManager;
import com.walker.tcp.ConnectionCallback;
import com.walker.tcp.ConnectionManager;
import com.walker.tcp.ProtocolResolver;
import com.walker.tcp.netty.WebSocketEngine;
import com.walker.tcp.netty.WebSocketNettyHandler;
import com.walker.tcp.netty.WebSocketServerInitializer;
import com.walker.tcp.websocket.WebsocketHandler;
import com.walker.tcp.websocket.WebsocketProtocolResolver;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.lang.Nullable;
 
import java.util.ArrayList;
import java.util.List;
 
@Configuration
@ConditionalOnProperty(prefix = "iplatform.tcp", name = "enabled", havingValue = "true", matchIfMissing = false)
public class WebsocketConfig {
 
    @Bean
    public WebsocketProtocolResolver websocketProtocolResolver(){
        WebsocketProtocolResolver websocketProtocolResolver =  new WebsocketProtocolResolver();
        websocketProtocolResolver.setPermitNotRegisterConnect(false);
        return websocketProtocolResolver;
    }
 
    private List<ProtocolResolver<?>> acquireProtocolResolverList(){
        List<ProtocolResolver<?>> protocolResolverList = new ArrayList<>(2);
        protocolResolverList.add(websocketProtocolResolver());
        return protocolResolverList;
    }
 
    /**
     * 配置业务定义的处理方法实现。
     * @param connectionManager
     * @param queueManager
     * @return
     * @date 2023-04-17
     */
    @Bean
    public WebsocketHandler wsServerHandler(ConnectionManager connectionManager
            , QueueManager queueManager, TcpProperties tcpProperties){
        WebsocketHandler websocketHandler = new WebsocketHandler();
        websocketHandler.setEmptyMsgDisconnect(false);
        websocketHandler.setEngineId(EngineType.INDEX_TCP_WEBSOCKET);
        websocketHandler.setConnectionManager(connectionManager);
        websocketHandler.setQueueManager(queueManager);
        websocketHandler.setProtocolResolverList(this.acquireProtocolResolverList());
//        websocketHandler.setScanPackages("com.iplatform.tcp.util.ws");
        websocketHandler.setScanPackages(tcpProperties.getScanPackagesWs());
        // 2023-09-27
        websocketHandler.setConnectionHost(tcpProperties.getConnectionHost());
        return websocketHandler;
    }
 
    @Bean
    public WebSocketNettyHandler wsNettyLongHandler(ConnectionManager connectionManager
            , WebsocketHandler wsServerHandler, TcpProperties tcpProperties){
        WebSocketNettyHandler webSocketNettyHandler = new WebSocketNettyHandler();
        webSocketNettyHandler.setConnectionManager(connectionManager);
        webSocketNettyHandler.setTcpServerHandler(wsServerHandler);
        webSocketNettyHandler.setUri(tcpProperties.getWebsocketUri());
        return webSocketNettyHandler;
    }
 
    @Bean
    public WebSocketServerInitializer wsServerInitializer(WebSocketNettyHandler wsNettyLongHandler, TcpProperties tcpProperties){
        WebSocketServerInitializer webSocketServerInitializer = new WebSocketServerInitializer();
        webSocketServerInitializer.setHandler(wsNettyLongHandler);
        webSocketServerInitializer.setProtocolResolverList(this.acquireProtocolResolverList());
        webSocketServerInitializer.setShowLog(tcpProperties.isShowLog());
        return webSocketServerInitializer;
    }
 
    @Bean
    public WebSocketEngine webSocketEngine(ConnectionManager connectionManager
            , WebSocketServerInitializer webSocketServerInitializer
            , TcpProperties tcpProperties, @Nullable ConnectionCallback connectionCallback
            , LoadBalanceProperties loadBalanceProperties){
        WebSocketEngine webSocketEngine = new WebSocketEngine();
        webSocketEngine.setId(EngineType.INDEX_TCP_WEBSOCKET);
        webSocketEngine.setName("websocket测试引擎");
        webSocketEngine.setConnectionManager(connectionManager);
        webSocketEngine.setServerInitializer(webSocketServerInitializer);
        webSocketEngine.setOpenHeartBeat(tcpProperties.isOpenHeartBeat());
        webSocketEngine.setBossThreadNum(tcpProperties.getBossThreadNum());
        webSocketEngine.setWorkerThreadNum(tcpProperties.getWorkerThreadNum());
//        webSocketEngine.setHeartBeatTimeInterval(180000);
        webSocketEngine.setHeartBeatTimeInterval(tcpProperties.getHeartBeatSeconds() * 1000);
        webSocketEngine.setPort(tcpProperties.getPortWs());
        // 2023-08-25
        if(connectionCallback != null){
            webSocketEngine.setConnectionCallback(connectionCallback);
        } else {
            webSocketEngine.setConnectionCallback(new TestConnectionCallback());
        }
        // 延时启动,测试用。正式注释掉。2023-09-27
        webSocketEngine.setEngineStartDelaySeconds(30);
        try {
            webSocketEngine.start();
        } catch (Exception e) {
            throw new ApplicationRuntimeException("启动'WebSocketEngine'失败:" + e.getMessage(), e);
        }
        return webSocketEngine;
    }
 
    /**
     * Websocket登录认证动作配置
     * @return
     * @date 2023-04-17
     */
    @Bean
    public LoginAction wsLoginAction(){
        LoginAction loginAction = new LoginAction();
        return loginAction;
    }
 
    /**
     * 配置'WebSocketPush'推送实现,同时注册到管理器中。
     * @param webSocketEngine
     * @param pushManager
     * @return
     * @date 2023-04-21
     */
    @Bean
    public Pushable websocketPush(WebSocketEngine webSocketEngine, PushManager pushManager){
        WebSocketPush webSocketPush = new WebSocketPush();
        webSocketPush.setWebSocketEngine(webSocketEngine);
        webSocketPush.startup();
        pushManager.register(webSocketPush);
        return webSocketPush;
    }
 
}