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.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);

View File

@@ -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")

View File

@@ -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;

View File

@@ -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);
}
}
}
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}