[+] 协议

This commit is contained in:
acgist
2023-03-03 23:31:59 +08:00
parent 9c5ab2ec9f
commit 07678b3297
13 changed files with 337 additions and 113 deletions

View File

@@ -90,13 +90,13 @@ public class ProtocolManager {
final Message message = JSONUtils.toJava(content, Message.class);
if(message == null) {
log.warn("信令消息格式错误(解析失败):{}", content);
client.push(this.platformErrorProtocol.build("信令消息格式错误(解析失败)"));
client.push(this.platformErrorProtocol.build(MessageCode.CODE_1002, "信令消息格式错误(解析失败)"));
return;
}
final Header header = message.getHeader();
if(header == null) {
log.warn("信令消息格式错误(没有头部):{}", content);
client.push(this.platformErrorProtocol.build("信令消息格式错误(没有头部)"));
client.push(this.platformErrorProtocol.build(MessageCode.CODE_1002, "信令消息格式错误(没有头部)"));
return;
}
final String v = header.getV();
@@ -106,14 +106,14 @@ public class ProtocolManager {
this.platformErrorProtocol.set(id);
if(v == null || id == null || signal == null) {
log.warn("信令消息格式错误(缺失头部关键参数):{}", content);
client.push(this.platformErrorProtocol.build("信令消息格式错误(缺失头部关键参数)"));
client.push(this.platformErrorProtocol.build(MessageCode.CODE_1002, "信令消息格式错误(缺失头部关键参数)"));
return;
}
// 开始处理协议
final Protocol protocol = this.protocolMapping.get(signal);
if(protocol == null) {
log.warn("不支持的信令协议:{}", content);
client.push(this.platformErrorProtocol.build("不支持的信令协议:" + signal));
client.push(this.platformErrorProtocol.build(MessageCode.CODE_3415, "不支持的信令协议:" + signal));
return;
}
if(log.isDebugEnabled()) {

View File

@@ -1,5 +1,7 @@
package com.acgist.taoyao.signal.protocol.platform;
import org.apache.commons.lang3.StringUtils;
import com.acgist.taoyao.boot.annotation.Description;
import com.acgist.taoyao.boot.annotation.Protocol;
import com.acgist.taoyao.boot.model.Message;
@@ -21,7 +23,7 @@ public class PlatformErrorProtocol extends ProtocolClientAdapter {
public static final String SIGNAL = "platform::error";
/**
* 请求ID缓存
* 绑定线程请求ID
*/
private ThreadLocal<Long> idLocal = new InheritableThreadLocal<>();
@@ -56,10 +58,14 @@ public class PlatformErrorProtocol extends ProtocolClientAdapter {
*/
public Message build(Exception e) {
final Message message = super.build();
if(e instanceof MessageCodeException code) {
message.setCode(code.getCode(), code.getMessage());
final String exceptionMessage = e.getMessage();
if(e instanceof MessageCodeException messageCodeException) {
// 自定义的异常
message.setCode(messageCodeException.getCode(), messageCodeException.getMessage());
} else if(StringUtils.isNotEmpty(exceptionMessage) && exceptionMessage.length() <= Byte.MAX_VALUE) {
// 少量信息返回异常信息
message.setMessage(exceptionMessage);
}
message.setBody(e.getMessage());
return message;
}

View File

@@ -20,7 +20,10 @@ import lombok.extern.slf4j.Slf4j;
*/
@Slf4j
@Description(
flow = "终端->信令服务+)终端"
flow = {
"信令服务+)终端",
"终端->信令服务+)终端"
}
)
public class PlatformRebootProtocol extends ProtocolClientAdapter implements ControlProtocol {
@@ -32,21 +35,29 @@ public class PlatformRebootProtocol extends ProtocolClientAdapter implements Con
super("重启平台信令", SIGNAL);
this.scriptProperties = scriptProperties;
}
/**
* 执行命令信令
*/
public void execute() {
log.info("重启平台");
this.clientManager.broadcast(this.build());
ScriptUtils.execute(this.scriptProperties.getPlatformReboot());
}
@Override
public void execute(String clientId, ClientType clientType, Client client, Message message, Map<String, Object> body) {
log.info("重启平台:{}", clientId);
this.clientManager.broadcast(message);
ScriptUtils.execute(this.scriptProperties.getPlatformReboot());
this.reboot(message);
}
/**
* 重启平台
*/
public void execute() {
log.info("重启平台");
this.reboot(this.build());
}
/**
* 重启平台
*
* @param message 消息
*/
private void reboot(Message message) {
this.clientManager.broadcast(message);
ScriptUtils.execute(this.scriptProperties.getPlatformReboot());
}
}

View File

@@ -22,7 +22,10 @@ import lombok.extern.slf4j.Slf4j;
*/
@Slf4j
@Description(
flow = "终端->信令服务+)终端"
flow = {
"信令服务+)终端",
"终端->信令服务+)终端"
}
)
public class PlatformShutdownProtocol extends ProtocolClientAdapter implements ControlProtocol {
@@ -38,23 +41,24 @@ public class PlatformShutdownProtocol extends ProtocolClientAdapter implements C
@Override
public void execute(String clientId, ClientType clientType, Client client, Message message, Map<String, Object> body) {
log.info("关闭平台:{}", clientId);
this.clientManager.broadcast(message);
this.shutdown();
}
/**
* 执行命令信令
*/
public void execute() {
log.info("关闭平台");
this.clientManager.broadcast(this.build());
this.shutdown();
this.shutdown(message);
}
/**
* 关闭平台
*/
private void shutdown() {
public void execute() {
log.info("关闭平台");
this.shutdown(this.build());
}
/**
* 关闭平台
*
* @param message 消息
*/
private void shutdown(Message message) {
this.clientManager.broadcast(message);
if(this.applicationContext instanceof ConfigurableApplicationContext context) {
// API关闭
if(context.isActive()) {

View File

@@ -1,10 +0,0 @@
package com.acgist.taoyao.signal.protocol.system;
/**
* 平台磁盘空间信令
*
* @author acgist
*/
public class SystemDiskspaceProtocol {
}

View File

@@ -0,0 +1,101 @@
package com.acgist.taoyao.signal.protocol.system;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;
import com.acgist.taoyao.boot.annotation.Description;
import com.acgist.taoyao.boot.annotation.Protocol;
import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.boot.utils.FileUtils;
import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.client.ClientType;
import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter;
import lombok.Getter;
import lombok.Setter;
/**
* 系统信息信令
*
* @author acgist
*/
@Protocol
@Description
public class SystemInfoProtocol extends ProtocolClientAdapter {
public static final String SIGNAL = "system::info";
public SystemInfoProtocol() {
super("系统信息信令", SIGNAL);
}
@Override
public void execute(String clientId, ClientType clientType, Client client, Message message, Map<String, Object> body) {
final Map<String, Object> info = new HashMap<>();
// 硬盘
final List<Diskspace> diskspace = new ArrayList<>();
// File.listRoots(); -> 不全
// FileSystems.getDefault().getFileStores(); -> 重复
Stream.of(File.listRoots()).forEach(v -> {
diskspace.add(new Diskspace(v.getPath(), v.getTotalSpace(), v.getFreeSpace()));
});
info.put("diskspace", diskspace);
// 内存
final Runtime runtime = Runtime.getRuntime();
info.put("maxMemory", runtime.maxMemory());
info.put("freeMemory", runtime.freeMemory());
info.put("totalMemory", runtime.totalMemory());
info.put("maxMemoryGracefully", FileUtils.formatSize(runtime.maxMemory()));
info.put("freeMemoryGracefully", FileUtils.formatSize(runtime.freeMemory()));
info.put("totalMemoryGracefully", FileUtils.formatSize(runtime.totalMemory()));
// 其他
info.put("osName", System.getProperty("os.name"));
info.put("osArch", System.getProperty("os.arch"));
info.put("osVersion", System.getProperty("os.version"));
info.put("javaVmName", System.getProperty("java.vm.name"));
info.put("javaVersion", System.getProperty("java.version"));
info.put("cpuProcessors", runtime.availableProcessors());
// 响应
client.push(this.build(info));
};
@Getter
@Setter
public static final class Diskspace {
/**
* 路径
*/
private final String path;
/**
* 总量
*/
private final Long total;
/**
* 空闲
*/
private final Long free;
/**
* 总量
*/
private final String totalGracefully;
/**
* 空闲
*/
private final String freeGracefully;
public Diskspace(String path, Long total, Long free) {
this.path = path;
this.total = total;
this.free = free;
this.totalGracefully = FileUtils.formatSize(total);
this.freeGracefully = FileUtils.formatSize(free);
}
}
}

View File

@@ -20,7 +20,10 @@ import lombok.extern.slf4j.Slf4j;
*/
@Slf4j
@Description(
flow = "终端->信令服务+)终端"
flow = {
"信令服务+)终端",
"终端->信令服务+)终端"
}
)
public class SystemRebootProtocol extends ProtocolClientAdapter implements ControlProtocol {
@@ -32,21 +35,29 @@ public class SystemRebootProtocol extends ProtocolClientAdapter implements Contr
super("重启系统信令", SIGNAL);
this.scriptProperties = scriptProperties;
}
/**
* 执行命令信令
*/
public void execute() {
log.info("重启系统");
this.clientManager.broadcast(this.build());
ScriptUtils.execute(this.scriptProperties.getSystemReboot());
}
@Override
public void execute(String clientId, ClientType clientType, Client client, Message message, Map<String, Object> body) {
log.info("重启系统:{}", clientId);
this.clientManager.broadcast(message);
ScriptUtils.execute(this.scriptProperties.getSystemReboot());
this.reboot(message);
}
/**
* 重启系统
*/
public void execute() {
log.info("重启系统");
this.reboot(this.build());
}
/**
* 重启系统
*
* @param message 消息
*/
private void reboot(Message message) {
this.clientManager.broadcast(message);
ScriptUtils.execute(this.scriptProperties.getSystemReboot());
}
}

View File

@@ -20,7 +20,10 @@ import lombok.extern.slf4j.Slf4j;
*/
@Slf4j
@Description(
flow = "终端->信令服务+)终端"
flow = {
"信令服务+)终端",
"终端->信令服务+)终端"
}
)
public class SystemShutdownProtocol extends ProtocolClientAdapter implements ControlProtocol {
@@ -33,20 +36,28 @@ public class SystemShutdownProtocol extends ProtocolClientAdapter implements Con
this.scriptProperties = scriptProperties;
}
/**
* 执行命令信令
*/
public void execute() {
log.info("关闭系统");
this.clientManager.broadcast(this.build());
ScriptUtils.execute(this.scriptProperties.getSystemShutdown());
}
@Override
public void execute(String clientId, ClientType clientType, Client client, Message message, Map<String, Object> body) {
log.info("关闭系统:{}", clientId);
this.clientManager.broadcast(message);
ScriptUtils.execute(this.scriptProperties.getSystemShutdown());
this.shutdown(message);
}
/**
* 执行命令信令
*/
public void execute() {
log.info("关闭系统");
this.shutdown(this.build());
}
/**
* 关闭系统
*
* @param message 消息
*/
private void shutdown(Message message) {
this.clientManager.broadcast(message);
ScriptUtils.execute(this.scriptProperties.getSystemShutdown());
}
}