diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/TerminalMessageDispatcher.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/TerminalMessageDispatcher.java index f54201c8..d106e5ad 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/TerminalMessageDispatcher.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/TerminalMessageDispatcher.java @@ -2,17 +2,13 @@ package com.orion.ops.module.asset.handler.host.terminal; import com.alibaba.fastjson.JSON; import com.orion.ops.framework.websocket.core.handler.TextWebSocketHandler; -import com.orion.ops.module.asset.handler.host.terminal.entity.MessageWrapper; +import com.orion.ops.module.asset.handler.host.terminal.entity.Message; import com.orion.ops.module.asset.handler.host.terminal.enums.InputOperatorTypeEnum; -import com.orion.ops.module.asset.handler.host.terminal.handler.TerminalConnectHandler; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.WebSocketSession; -import javax.annotation.Resource; -import java.util.Optional; - /** * 终端处理器 * @@ -24,37 +20,15 @@ import java.util.Optional; @Component public class TerminalMessageDispatcher extends TextWebSocketHandler { - @Resource - private TerminalConnectHandler terminalConnectHandler; - @Override public void onMessage(WebSocketSession session, String payload) { try { // 解析类型 - InputOperatorTypeEnum type = Optional.ofNullable(payload) - .map(s -> JSON.parseObject(s, MessageWrapper.class)) - .map(MessageWrapper::getType) - .map(InputOperatorTypeEnum::of) - .orElse(null); - if (InputOperatorTypeEnum.CONNECT.equals(type)) { - // 连接主机 - // {"t":"co","s": "1001","b":{"h":1}} - terminalConnectHandler.process(session, payload); - } else if (InputOperatorTypeEnum.CLOSE.equals(type)) { - // 关闭连接 - - } else if (InputOperatorTypeEnum.PING.equals(type)) { - // ping - - } else if (InputOperatorTypeEnum.RESIZE.equals(type)) { - // resize - - } else if (InputOperatorTypeEnum.EXEC.equals(type)) { - // 执行 - - } else if (InputOperatorTypeEnum.INPUT.equals(type)) { - // 输入 - + Message message = JSON.parseObject(payload, Message.class); + InputOperatorTypeEnum type = InputOperatorTypeEnum.of(message.getType()); + if (type != null) { + // 处理消息 + type.getHandler().process(session, message, payload); } } catch (Exception e) { log.error("TerminalDispatchHandler-handleMessage-error msg: {}", payload, e); diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/entity/MessageWrapper.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/entity/Message.java similarity index 95% rename from orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/entity/MessageWrapper.java rename to orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/entity/Message.java index ba980878..9236ec01 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/entity/MessageWrapper.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/entity/Message.java @@ -19,7 +19,7 @@ import lombok.NoArgsConstructor; @NoArgsConstructor @AllArgsConstructor @Schema(name = "MessageWrapper", description = "消息体包装") -public class MessageWrapper { +public class Message { @JSONField(name = "s") @Schema(description = "会话id") diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/entity/request/TerminalConnectRequest.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/entity/request/TerminalConnectRequest.java index f98bd258..37017dd1 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/entity/request/TerminalConnectRequest.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/entity/request/TerminalConnectRequest.java @@ -21,6 +21,8 @@ import lombok.NoArgsConstructor; @Schema(name = "TerminalConnectRequest", description = "终端连接请求 实体对象") public class TerminalConnectRequest { + // 连接主机 {"t":"co","s": "1001","b":{"h":1}} + @JSONField(name = "h") @Schema(description = "主机id") private String hostId; diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/enums/InputOperatorTypeEnum.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/enums/InputOperatorTypeEnum.java index 87ee70ae..8bfe1b68 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/enums/InputOperatorTypeEnum.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/enums/InputOperatorTypeEnum.java @@ -1,7 +1,12 @@ package com.orion.ops.module.asset.handler.host.terminal.enums; -import lombok.AllArgsConstructor; +import com.orion.ops.module.asset.handler.host.terminal.handler.ITerminalHandler; +import com.orion.ops.module.asset.handler.host.terminal.handler.TerminalConnectHandler; +import com.orion.spring.SpringHolder; import lombok.Getter; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; /** * 输入操作类型枚举 @@ -10,44 +15,53 @@ import lombok.Getter; * @version 1.0.0 * @since 2023/12/29 15:33 */ -@Getter -@AllArgsConstructor public enum InputOperatorTypeEnum { /** * 连接主机 */ - CONNECT("co"), + CONNECT("co", TerminalConnectHandler.class), /** * 关闭连接 */ - CLOSE("cl"), + CLOSE("cl", TerminalConnectHandler.class), /** * ping */ - PING("p"), + PING("p", TerminalConnectHandler.class), /** * 修改大小 */ - RESIZE("rs"), + RESIZE("rs", TerminalConnectHandler.class), /** * 执行 */ - EXEC("e"), + EXEC("e", TerminalConnectHandler.class), /** * 输入 */ - INPUT("i"), + INPUT("i", TerminalConnectHandler.class), ; + @Getter private final String type; + private final Class handlerBean; + + @Getter + private ITerminalHandler handler; + + InputOperatorTypeEnum(String type, Class handlerBean) { + this.type = type; + this.handlerBean = handlerBean; + } + public static InputOperatorTypeEnum of(String type) { if (type == null) { return null; @@ -60,4 +74,19 @@ public enum InputOperatorTypeEnum { return null; } + /** + * 类型字段定义 + */ + @Component + static class TypeFieldDefinition { + + @PostConstruct + public void init() { + for (InputOperatorTypeEnum value : InputOperatorTypeEnum.values()) { + value.handler = SpringHolder.getBean(value.handlerBean); + } + } + + } + } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/AbstractTerminalHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/AbstractTerminalHandler.java index b435185f..0e1831c5 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/AbstractTerminalHandler.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/AbstractTerminalHandler.java @@ -1,8 +1,7 @@ package com.orion.ops.module.asset.handler.host.terminal.handler; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.TypeReference; -import com.orion.ops.module.asset.handler.host.terminal.entity.MessageWrapper; +import com.alibaba.fastjson.JSONObject; +import com.orion.ops.module.asset.handler.host.terminal.entity.Message; import org.springframework.web.socket.WebSocketSession; /** @@ -15,17 +14,20 @@ import org.springframework.web.socket.WebSocketSession; public abstract class AbstractTerminalHandler implements ITerminalHandler { /** - * 类型转换器 + * 类型 */ - private final TypeReference> convert; + private final Class convert; - public AbstractTerminalHandler(TypeReference> convert) { + public AbstractTerminalHandler(Class convert) { this.convert = convert; } @Override - public void process(WebSocketSession session, String payload) { - this.onMessage(session, JSON.parseObject(payload, convert)); + @SuppressWarnings("unchecked") + public void process(WebSocketSession session, Message message, String payload) { + Message res = (Message) message; + res.setBody(((JSONObject) message.getBody()).toJavaObject(convert)); + this.onMessage(session, res); } /** @@ -34,6 +36,6 @@ public abstract class AbstractTerminalHandler implements ITerminalHandler { * @param session session * @param msg msg */ - protected abstract void onMessage(WebSocketSession session, MessageWrapper msg); + protected abstract void onMessage(WebSocketSession session, Message msg); } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/ITerminalHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/ITerminalHandler.java index 3f770d1a..f5ac554d 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/ITerminalHandler.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/ITerminalHandler.java @@ -1,5 +1,6 @@ package com.orion.ops.module.asset.handler.host.terminal.handler; +import com.orion.ops.module.asset.handler.host.terminal.entity.Message; import org.springframework.web.socket.WebSocketSession; /** @@ -15,8 +16,9 @@ public interface ITerminalHandler { * 处理消息 * * @param session session + * @param message message * @param payload payload */ - void process(WebSocketSession session, String payload); + void process(WebSocketSession session, Message message, String payload); } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalConnectHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalConnectHandler.java index 780e40ff..aa6b2932 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalConnectHandler.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalConnectHandler.java @@ -1,7 +1,6 @@ package com.orion.ops.module.asset.handler.host.terminal.handler; -import com.alibaba.fastjson.TypeReference; -import com.orion.ops.module.asset.handler.host.terminal.entity.MessageWrapper; +import com.orion.ops.module.asset.handler.host.terminal.entity.Message; import com.orion.ops.module.asset.handler.host.terminal.entity.request.TerminalConnectRequest; import org.springframework.stereotype.Component; import org.springframework.web.socket.WebSocketSession; @@ -17,12 +16,11 @@ import org.springframework.web.socket.WebSocketSession; public class TerminalConnectHandler extends AbstractTerminalHandler { public TerminalConnectHandler() { - super(new TypeReference>(TerminalConnectRequest.class) { - }); + super(TerminalConnectRequest.class); } @Override - protected void onMessage(WebSocketSession session, MessageWrapper msg) { + protected void onMessage(WebSocketSession session, Message msg) { System.out.println(msg); }