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.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);
|
||||||
|
|||||||
@@ -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")
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user