feat: 处理器枚举化.
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -19,7 +19,7 @@ import lombok.NoArgsConstructor;
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Schema(name = "MessageWrapper", description = "消息体包装")
|
||||
public class MessageWrapper<T> {
|
||||
public class Message<T> {
|
||||
|
||||
@JSONField(name = "s")
|
||||
@Schema(description = "会话id")
|
||||
@@ -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;
|
||||
|
||||
@@ -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<? 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) {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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<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;
|
||||
}
|
||||
|
||||
@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<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 msg msg
|
||||
*/
|
||||
protected abstract void onMessage(WebSocketSession session, MessageWrapper<T> msg);
|
||||
protected abstract void onMessage(WebSocketSession session, Message<T> msg);
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
@@ -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<TerminalConnectRequest> {
|
||||
|
||||
public TerminalConnectHandler() {
|
||||
super(new TypeReference<MessageWrapper<TerminalConnectRequest>>(TerminalConnectRequest.class) {
|
||||
});
|
||||
super(TerminalConnectRequest.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onMessage(WebSocketSession session, MessageWrapper<TerminalConnectRequest> msg) {
|
||||
protected void onMessage(WebSocketSession session, Message<TerminalConnectRequest> msg) {
|
||||
System.out.println(msg);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user