nishiwei
5 days ago 3f43e40ed1a1e9f66b3ad2862da9dbc4b710c712
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
package com.ard.sample.manage.service.impl;
 
import com.ard.sample.component.mqtt.model.CommonTopicReceiver;
import com.ard.sample.component.websocket.config.ConcurrentWebSocketSession;
import com.ard.sample.component.websocket.model.CustomWebSocketMessage;
import com.ard.sample.manage.model.dto.DeviceDTO;
import com.ard.sample.manage.model.dto.TelemetryDTO;
import com.ard.sample.manage.model.enums.DockModelEnum;
import com.ard.sample.manage.service.ITSAService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
 
import java.util.Collection;
 
/**
 * 【机场1】OSD 入站分发器(Dock1 适配共享层新增,唯一侵入共享层的分流点)。
 *
 * <p>DeviceServiceImpl.handleOSD 收到 INBOUND_OSD 消息后委托本类,按设备机型分发到两条 OSD 处理链:
 * <ul>
 *   <li>DOCK1(67) → dock1 链:{@code dock1GatewayOSDServiceImpl → dock1DeviceOSDServiceImpl → dock1DockOSDServiceImpl}</li>
 *   <li>其余(DOCK2(91) / 遥控器等无法识别来源)→ dock2 原链:
 *       {@code gatewayOSDServiceImpl → deviceOSDServiceImpl → dockOSDServiceImpl}(行为与改造前完全一致)</li>
 * </ul>
 * dock1 链为普通 @Service(不带 @ServiceActivator),INBOUND_OSD 通道消费者仍只有 DeviceServiceImpl 一个。
 *
 * @author ard
 * @date 2026/10/16
 */
@Service
public class DockOsdDispatcher {
 
    @Autowired
    @Qualifier("gatewayOSDServiceImpl")
    private ITSAService dock2TsaService;
 
    @Autowired
    @Qualifier("dock1GatewayOSDServiceImpl")
    private ITSAService dock1TsaService;
 
    /**
     * 分发 OSD 消息到对应机型的处理链。
     *
     * @param receiver    OSD 报文
     * @param device      消息来源设备(含 domain/type/subType)
     * @param webSessions 目标 WebSocket 会话
     * @param wsMessage   待推送的 WebSocket 消息
     */
    public void dispatch(CommonTopicReceiver receiver, DeviceDTO device,
                         Collection<ConcurrentWebSocketSession> webSessions,
                         CustomWebSocketMessage<TelemetryDTO> wsMessage) {
        DockModelEnum model = DockModelResolver.resolve(device);
        if (DockModelEnum.DOCK1 == model) {
            dock1TsaService.handleOSD(receiver, device, webSessions, wsMessage);
            return;
        }
        // dock2 及一切无法识别的来源:原链透传,保证 dock2 行为零变化
        dock2TsaService.handleOSD(receiver, device, webSessions, wsMessage);
    }
}