feat: 处理器枚举化.

This commit is contained in:
lijiahang
2024-01-02 16:35:06 +08:00
parent 6ff8ca2526
commit 90ffc472fa
7 changed files with 64 additions and 57 deletions

View File

@@ -2,17 +2,13 @@ package com.orion.ops.module.asset.handler.host.terminal;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.orion.ops.framework.websocket.core.handler.TextWebSocketHandler; 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.enums.InputOperatorTypeEnum;
import com.orion.ops.module.asset.handler.host.terminal.handler.TerminalConnectHandler;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.WebSocketSession;
import javax.annotation.Resource;
import java.util.Optional;
/** /**
* 终端处理器 * 终端处理器
* *
@@ -24,37 +20,15 @@ import java.util.Optional;
@Component @Component
public class TerminalMessageDispatcher extends TextWebSocketHandler { public class TerminalMessageDispatcher extends TextWebSocketHandler {
@Resource
private TerminalConnectHandler terminalConnectHandler;
@Override @Override
public void onMessage(WebSocketSession session, String payload) { public void onMessage(WebSocketSession session, String payload) {
try { try {
// 解析类型 // 解析类型
InputOperatorTypeEnum type = Optional.ofNullable(payload) Message<?> message = JSON.parseObject(payload, Message.class);
.map(s -> JSON.parseObject(s, MessageWrapper.class)) InputOperatorTypeEnum type = InputOperatorTypeEnum.of(message.getType());
.map(MessageWrapper::getType) if (type != null) {
.map(InputOperatorTypeEnum::of) // 处理消息
.orElse(null); type.getHandler().process(session, message, payload);
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)) {
// 输入
} }
} catch (Exception e) { } catch (Exception e) {
log.error("TerminalDispatchHandler-handleMessage-error msg: {}", payload, e); log.error("TerminalDispatchHandler-handleMessage-error msg: {}", payload, e);

View File

@@ -19,7 +19,7 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@Schema(name = "MessageWrapper", description = "消息体包装") @Schema(name = "MessageWrapper", description = "消息体包装")
public class MessageWrapper<T> { public class Message<T> {
@JSONField(name = "s") @JSONField(name = "s")
@Schema(description = "会话id") @Schema(description = "会话id")

View File

@@ -21,6 +21,8 @@ import lombok.NoArgsConstructor;
@Schema(name = "TerminalConnectRequest", description = "终端连接请求 实体对象") @Schema(name = "TerminalConnectRequest", description = "终端连接请求 实体对象")
public class TerminalConnectRequest { public class TerminalConnectRequest {
// 连接主机 {"t":"co","s": "1001","b":{"h":1}}
@JSONField(name = "h") @JSONField(name = "h")
@Schema(description = "主机id") @Schema(description = "主机id")
private String hostId; private String hostId;

View File

@@ -1,7 +1,12 @@
package com.orion.ops.module.asset.handler.host.terminal.enums; 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 lombok.Getter;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
/** /**
* 输入操作类型枚举 * 输入操作类型枚举
@@ -10,44 +15,53 @@ import lombok.Getter;
* @version 1.0.0 * @version 1.0.0
* @since 2023/12/29 15:33 * @since 2023/12/29 15:33
*/ */
@Getter
@AllArgsConstructor
public enum InputOperatorTypeEnum { public enum InputOperatorTypeEnum {
/** /**
* 连接主机 * 连接主机
*/ */
CONNECT("co"), CONNECT("co", TerminalConnectHandler.class),
/** /**
* 关闭连接 * 关闭连接
*/ */
CLOSE("cl"), CLOSE("cl", TerminalConnectHandler.class),
/** /**
* ping * 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 String type;
private final Class<? extends ITerminalHandler> handlerBean;
@Getter
private ITerminalHandler handler;
InputOperatorTypeEnum(String type, Class<? extends ITerminalHandler> handlerBean) {
this.type = type;
this.handlerBean = handlerBean;
}
public static InputOperatorTypeEnum of(String type) { public static InputOperatorTypeEnum of(String type) {
if (type == null) { if (type == null) {
return null; return null;
@@ -60,4 +74,19 @@ public enum InputOperatorTypeEnum {
return null; return null;
} }
/**
* 类型字段定义
*/
@Component
static class TypeFieldDefinition {
@PostConstruct
public void init() {
for (InputOperatorTypeEnum value : InputOperatorTypeEnum.values()) {
value.handler = SpringHolder.getBean(value.handlerBean);
}
}
}
} }

View File

@@ -1,8 +1,7 @@
package com.orion.ops.module.asset.handler.host.terminal.handler; package com.orion.ops.module.asset.handler.host.terminal.handler;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference; import com.orion.ops.module.asset.handler.host.terminal.entity.Message;
import com.orion.ops.module.asset.handler.host.terminal.entity.MessageWrapper;
import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.WebSocketSession;
/** /**
@@ -15,17 +14,20 @@ import org.springframework.web.socket.WebSocketSession;
public abstract class AbstractTerminalHandler<T> implements ITerminalHandler { public abstract class AbstractTerminalHandler<T> implements ITerminalHandler {
/** /**
* 类型转换器 * 类型
*/ */
private final TypeReference<MessageWrapper<T>> convert; private final Class<T> convert;
public AbstractTerminalHandler(TypeReference<MessageWrapper<T>> convert) { public AbstractTerminalHandler(Class<T> convert) {
this.convert = convert; this.convert = convert;
} }
@Override @Override
public void process(WebSocketSession session, String payload) { @SuppressWarnings("unchecked")
this.onMessage(session, JSON.parseObject(payload, convert)); public void process(WebSocketSession session, Message<?> message, String payload) {
Message<T> res = (Message<T>) message;
res.setBody(((JSONObject) message.getBody()).toJavaObject(convert));
this.onMessage(session, res);
} }
/** /**
@@ -34,6 +36,6 @@ public abstract class AbstractTerminalHandler<T> implements ITerminalHandler {
* @param session session * @param session session
* @param msg msg * @param msg msg
*/ */
protected abstract void onMessage(WebSocketSession session, MessageWrapper<T> msg); protected abstract void onMessage(WebSocketSession session, Message<T> msg);
} }

View File

@@ -1,5 +1,6 @@
package com.orion.ops.module.asset.handler.host.terminal.handler; 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; import org.springframework.web.socket.WebSocketSession;
/** /**
@@ -15,8 +16,9 @@ public interface ITerminalHandler {
* 处理消息 * 处理消息
* *
* @param session session * @param session session
* @param message message
* @param payload payload * @param payload payload
*/ */
void process(WebSocketSession session, String payload); void process(WebSocketSession session, Message<?> message, String payload);
} }

View File

@@ -1,7 +1,6 @@
package com.orion.ops.module.asset.handler.host.terminal.handler; 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.Message;
import com.orion.ops.module.asset.handler.host.terminal.entity.MessageWrapper;
import com.orion.ops.module.asset.handler.host.terminal.entity.request.TerminalConnectRequest; import com.orion.ops.module.asset.handler.host.terminal.entity.request.TerminalConnectRequest;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.WebSocketSession;
@@ -17,12 +16,11 @@ import org.springframework.web.socket.WebSocketSession;
public class TerminalConnectHandler extends AbstractTerminalHandler<TerminalConnectRequest> { public class TerminalConnectHandler extends AbstractTerminalHandler<TerminalConnectRequest> {
public TerminalConnectHandler() { public TerminalConnectHandler() {
super(new TypeReference<MessageWrapper<TerminalConnectRequest>>(TerminalConnectRequest.class) { super(TerminalConnectRequest.class);
});
} }
@Override @Override
protected void onMessage(WebSocketSession session, MessageWrapper<TerminalConnectRequest> msg) { protected void onMessage(WebSocketSession session, Message<TerminalConnectRequest> msg) {
System.out.println(msg); System.out.println(msg);
} }