From 931194abcfeb8628ca9fbb17a375639ad739068c Mon Sep 17 00:00:00 2001 From: linrf Date: Mon, 17 Jul 2023 14:04:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9netty=E7=BC=96=E7=A0=81?= =?UTF-8?q?=E8=A7=A3=E5=8E=8B=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/docus/server/CodeGenerator.java | 66 ++++++------ .../com/docus/server/common/MsgConstants.java | 56 ++++++++++ .../netty/server/ChannelRepository.java | 24 +++-- .../server/handler/EchoServerHandler.java | 2 +- .../server/handler/NettyBusinessHandler.java | 97 +++++++++-------- .../server/handler/NettyHeartbeatHandler.java | 100 +++++++++++++----- .../server/handler/TerminatorContent.java | 22 ++++ .../common/netty/server/handler/Test.java | 32 ------ .../server/convert/SchTerminatorConvert.java | 4 +- .../dao/impl/SchTerminatorDaoImpl.java | 15 ++- .../server/service/ISchTerminatorService.java | 9 ++ .../impl/SchTerminatorServiceImpl.java | 32 ++++++ .../schterminator/AddSchTerminatorDTO.java | 40 ++++--- .../schterminator/EditSchTerminatorDTO.java | 51 +++++---- .../scheduling.management/SchTerminator.java | 42 ++++---- .../com/docus/server/enums/BusyStateEnum.java | 31 ++++++ .../docus/server/enums/OnlineStateEnum.java | 31 ++++++ .../docus/server/enums/RestrictStateEnum.java | 31 ++++++ .../schterminator/SchTerminatorVO.java | 52 +++++---- 19 files changed, 508 insertions(+), 229 deletions(-) create mode 100644 collector-scheduling-management/src/main/java/com/docus/server/common/MsgConstants.java create mode 100644 collector-scheduling-management/src/main/java/com/docus/server/common/netty/server/handler/TerminatorContent.java delete mode 100644 collector-scheduling-management/src/main/java/com/docus/server/common/netty/server/handler/Test.java create mode 100644 docus-client-interface/src/main/java/com/docus/server/enums/BusyStateEnum.java create mode 100644 docus-client-interface/src/main/java/com/docus/server/enums/OnlineStateEnum.java create mode 100644 docus-client-interface/src/main/java/com/docus/server/enums/RestrictStateEnum.java diff --git a/collector-scheduling-management/src/main/java/com/docus/server/CodeGenerator.java b/collector-scheduling-management/src/main/java/com/docus/server/CodeGenerator.java index d63d09c..cf79a1d 100644 --- a/collector-scheduling-management/src/main/java/com/docus/server/CodeGenerator.java +++ b/collector-scheduling-management/src/main/java/com/docus/server/CodeGenerator.java @@ -1,33 +1,33 @@ -package com.docus.server; - -import com.baomidou.mybatisplus.generator.AutoGenerator; -import com.docus.infrastructure.generator.BaseCodeGenerator; - -import java.util.HashMap; -import java.util.Map; - -public class CodeGenerator { - public static void main(String[] args) { - //字段名和枚举名的映射,不区分表名 - Map enumColumnMap = new HashMap<>(); - enumColumnMap.put("PROFILE_ITЕM", "AdminProfileItemEnum"); - - enumColumnMap.put("ORGANIZATION_TYPE", "OrganizationTypeEnum "); - enumColumnMap.put("OPERATE_STATUS", "OperateStatusEnum"); - enumColumnMap.put("STATE", "StateEnum"); - enumColumnMap.put("PRIVILEGE_LEVEL", "PrivilegeLevelEnum"); - enumColumnMap.put("FLAG", "FlagEnum"); - enumColumnMap.put("collect_type", "CollectTypeEnum"); - BaseCodeGenerator.setEnumColumnMap(enumColumnMap); - BaseCodeGenerator.setModuleName("collector-scheduling-management");//多个module,需要指定modulename - //指定entity生成到独立module里,并生成 api interface - BaseCodeGenerator.setClientInterfaceModuleName("docus-client-interface"); - BaseCodeGenerator.setClientInterfaceSubFolder("scheduling.management");//文件夹 - BaseCodeGenerator.setClientInterfaceBasePackage("com.docus.server"); - AutoGenerator defaultConfig = BaseCodeGenerator.getDefaultConfig(); - defaultConfig.getGlobalConfig().setSwagger2(true); - defaultConfig.getStrategy().setEntityLombokModel(true); - defaultConfig.getStrategy().setInclude("sch_virtual_log", "sch_collect_error_log", "sch_collect_record", "sch_collect_record_retry_log", "sch_collector", "sch_collector_config", "sch_collector_version", "sch_collector_version_file", "sch_collector_version_log", "sch_operation_log", "sch_system_params", "sch_terminator");//需要生成的表,可指定多个,留空为全部生成 - BaseCodeGenerator.generate(defaultConfig); - } -} +//package com.docus.server; +// +//import com.baomidou.mybatisplus.generator.AutoGenerator; +//import com.docus.infrastructure.generator.BaseCodeGenerator; +// +//import java.util.HashMap; +//import java.util.Map; +// +//public class CodeGenerator { +// public static void main(String[] args) { +// //字段名和枚举名的映射,不区分表名 +// Map enumColumnMap = new HashMap<>(); +// enumColumnMap.put("PROFILE_ITЕM", "AdminProfileItemEnum"); +// +// enumColumnMap.put("ORGANIZATION_TYPE", "OrganizationTypeEnum "); +// enumColumnMap.put("OPERATE_STATUS", "OperateStatusEnum"); +// enumColumnMap.put("STATE", "StateEnum"); +// enumColumnMap.put("PRIVILEGE_LEVEL", "PrivilegeLevelEnum"); +// enumColumnMap.put("FLAG", "FlagEnum"); +// enumColumnMap.put("collect_type", "CollectTypeEnum"); +// BaseCodeGenerator.setEnumColumnMap(enumColumnMap); +// BaseCodeGenerator.setModuleName("collector-scheduling-management");//多个module,需要指定modulename +// //指定entity生成到独立module里,并生成 api interface +// BaseCodeGenerator.setClientInterfaceModuleName("docus-client-interface"); +// BaseCodeGenerator.setClientInterfaceSubFolder("scheduling.management");//文件夹 +// BaseCodeGenerator.setClientInterfaceBasePackage("com.docus.server"); +// AutoGenerator defaultConfig = BaseCodeGenerator.getDefaultConfig(); +// defaultConfig.getGlobalConfig().setSwagger2(true); +// defaultConfig.getStrategy().setEntityLombokModel(true); +// defaultConfig.getStrategy().setInclude("sch_virtual_log", "sch_collect_error_log", "sch_collect_record", "sch_collect_record_retry_log", "sch_collector", "sch_collector_config", "sch_collector_version", "sch_collector_version_file", "sch_collector_version_log", "sch_operation_log", "sch_system_params", "sch_terminator");//需要生成的表,可指定多个,留空为全部生成 +// BaseCodeGenerator.generate(defaultConfig); +// } +//} diff --git a/collector-scheduling-management/src/main/java/com/docus/server/common/MsgConstants.java b/collector-scheduling-management/src/main/java/com/docus/server/common/MsgConstants.java new file mode 100644 index 0000000..c8a3966 --- /dev/null +++ b/collector-scheduling-management/src/main/java/com/docus/server/common/MsgConstants.java @@ -0,0 +1,56 @@ +package com.docus.server.common; + +public class MsgConstants { + + /** + * 客户端与采集调度器心跳 + */ + public static final String HEARTBEAT_REQUEST = "0".trim(); + + /** + * 客户端上线注册 + */ + public static final String ONLINE_REGISTER = "1".trim(); + + /** + * 客户端下线移除 + */ + public static final String OFFLINE_REMOVE = "2".trim(); + + /** + * 客户端异常注册 + */ + public static final String EXCEPTION_REMOVE = "3".trim(); + + /** + * 终端重启命令 + */ + public static final String TERMINATOR_RESTART = "4".trim(); + + /** + * 采集器重启命令 + */ + public static final String COLLECTOR_RESTART = "5".trim(); + + /** + * 虚拟机重启命令 + */ + public static final String VIRTUAL_RESTART = "6".trim(); + + /** + * 更新采集器文件命令 + */ + public static final String UPDATE_COLLECTOR_FILE = "7".trim(); + + /** + * 更新采集器配置命令 + */ + public static final String UPDATE_COLLECTOR_CONFIG = "8".trim(); + + /** + * 采集调度器下发任务命令 + */ + public static final String SCH_DISTRIBUTE_TASKS = "9".trim(); + + +} diff --git a/collector-scheduling-management/src/main/java/com/docus/server/common/netty/server/ChannelRepository.java b/collector-scheduling-management/src/main/java/com/docus/server/common/netty/server/ChannelRepository.java index 59b19bc..a4ab18d 100644 --- a/collector-scheduling-management/src/main/java/com/docus/server/common/netty/server/ChannelRepository.java +++ b/collector-scheduling-management/src/main/java/com/docus/server/common/netty/server/ChannelRepository.java @@ -1,10 +1,13 @@ package com.docus.server.common.netty.server; +import com.docus.server.enums.OnlineStateEnum; +import com.docus.server.service.ISchTerminatorService; import io.netty.channel.Channel; import io.netty.util.AttributeKey; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import javax.annotation.Resource; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -14,22 +17,23 @@ import java.util.concurrent.ConcurrentHashMap; @Component @Slf4j public class ChannelRepository { + @Resource + private ISchTerminatorService iSchTerminatorService; - + /** + * + */ private final static Map CHANNEL_CACHE_MAP = new ConcurrentHashMap<>(); /** - * 客户端上线 - * - * @param key - * @param value + * 终端上线 */ - public void put(String key, Channel value) { + public void put(String key, Channel value, OnlineStateEnum onlineState) { //客户端上线 CHANNEL_CACHE_MAP.put(key, value); AttributeKey attributeKey = AttributeKey.valueOf("user"); value.attr(attributeKey).set(key); - //todo 数据库更新工控机状态上线 + iSchTerminatorService.saveOrUpdate(key, onlineState); } public String getClientKey(Channel channel) { @@ -49,13 +53,11 @@ public class ChannelRepository { } /** - * 工控机离线,工控机上所有设备离线 - * - * @param key + * 终端离线 */ public void remove(String key) { CHANNEL_CACHE_MAP.remove(key); - //todo 数据库更新工控机状态离线 + iSchTerminatorService.saveOrUpdate(key, OnlineStateEnum.OFFLINE); } } diff --git a/collector-scheduling-management/src/main/java/com/docus/server/common/netty/server/handler/EchoServerHandler.java b/collector-scheduling-management/src/main/java/com/docus/server/common/netty/server/handler/EchoServerHandler.java index 249f1c1..600aa47 100644 --- a/collector-scheduling-management/src/main/java/com/docus/server/common/netty/server/handler/EchoServerHandler.java +++ b/collector-scheduling-management/src/main/java/com/docus/server/common/netty/server/handler/EchoServerHandler.java @@ -51,7 +51,7 @@ public class EchoServerHandler extends ChannelInboundHandlerAdapter { //将byte[]转成字符串用于打印 String str = new String(barray); - CommMsg commMsg = JSON.fromJSONWithGeneric(str, new TypeReference>() { + CommMsg commMsg = JSON.fromJSONWithGeneric(str, new TypeReference>() { }); if (str.length() > 0) { diff --git a/collector-scheduling-management/src/main/java/com/docus/server/common/netty/server/handler/NettyBusinessHandler.java b/collector-scheduling-management/src/main/java/com/docus/server/common/netty/server/handler/NettyBusinessHandler.java index 36f1cc1..8bb36db 100644 --- a/collector-scheduling-management/src/main/java/com/docus/server/common/netty/server/handler/NettyBusinessHandler.java +++ b/collector-scheduling-management/src/main/java/com/docus/server/common/netty/server/handler/NettyBusinessHandler.java @@ -2,9 +2,10 @@ package com.docus.server.common.netty.server.handler; import com.docus.core.util.StringUtils; import com.docus.core.util.json.JSON; +import com.docus.server.common.MsgConstants; import com.docus.server.common.netty.CommMsg; -import com.docus.server.common.netty.Payload; import com.docus.server.common.netty.server.ChannelRepository; +import com.docus.server.enums.OnlineStateEnum; import com.fasterxml.jackson.core.type.TypeReference; import io.netty.buffer.ByteBuf; import io.netty.channel.Channel; @@ -28,33 +29,13 @@ import java.net.InetSocketAddress; @Component public class NettyBusinessHandler extends SimpleChannelInboundHandler { - private static final ChannelGroup GROUP = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + private static final ChannelGroup DEFAULT_CHANNEL_GROUP = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); @Resource private ChannelRepository repository; - protected void channelRead0(ChannelHandlerContext channelHandlerContext, Payload.Message message) { - if (message.getCmd() == Payload.Message.type.AUTH) { - log.info("接受到工控机<{}>的认证消息:{}", message.getClient(), message.getContent()); - InetSocketAddress ipSocket = (InetSocketAddress) channelHandlerContext.channel().remoteAddress(); - String clientIp = ipSocket.getAddress().getHostAddress(); - log.info("工控机:{},连接上线,IP地址信息:{}", message.getClient(), clientIp); - Channel channel = repository.get(message.getClient()); - if (channel != null && channel.isOpen()) { - channel.close(); - } - repository.put(message.getClient(), channelHandlerContext.channel()); - } - if (message.getCmd() == Payload.Message.type.PRINT_DONE) { - log.info("接受到打印回馈指令,内容{}", message.getContent()); - } - if (message.getCmd() == Payload.Message.type.WHATEVER) { - log.info("收到测试消息:{}", message.getContent()); - } - } - @Override - protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception { + protected void channelRead0(ChannelHandlerContext channelHandlerContext, ByteBuf msg) throws Exception { ByteBuf buf = (ByteBuf) msg; //创建目标大小的数组 byte[] barray = new byte[buf.readableBytes()]; @@ -68,47 +49,76 @@ public class NettyBusinessHandler extends SimpleChannelInboundHandler { return; } - CommMsg commMsg = JSON.fromJSONWithGeneric(message, new TypeReference>() { + CommMsg commMsg = JSON.fromJSONWithGeneric(message, new TypeReference>() { }); String messageType = commMsg.getMessageType(); + String messageTime = commMsg.getMessageTime(); + TerminatorContent messageContent = commMsg.getContent(); -// if (message.getCmd() == Payload.Message.type.AUTH) { -// log.info("接受到工控机<{}>的认证消息:{}", message.getClient(), message.getContent()); +// if (messageType.equals(MsgConstants.ONLINE_REGISTER)) { +// log.info("接受到【采集器-终端】的上线注册消息:消息类型={},消息时间={},消息内容={}", messageType, messageTime, messageContent); // InetSocketAddress ipSocket = (InetSocketAddress) channelHandlerContext.channel().remoteAddress(); // String clientIp = ipSocket.getAddress().getHostAddress(); -// log.info("工控机:{},连接上线,IP地址信息:{}", message.getClient(), clientIp); -// Channel channel = repository.get(message.getClient()); +// log.info("【采集器-终端IP】:{},连接上线,IP地址信息:{}", clientIp, clientIp); +// Channel channel = repository.get(clientIp); // if (channel != null && channel.isOpen()) { // channel.close(); // } -// repository.put(message.getClient(), channelHandlerContext.channel()); -// } -// if (message.getCmd() == Payload.Message.type.PRINT_DONE) { -// log.info("接受到打印回馈指令,内容{}", message.getContent()); -// } -// if (message.getCmd() == Payload.Message.type.WHATEVER) { -// log.info("收到测试消息:{}", message.getContent()); +// +// /* +// * 将ip和channel进行映射 +// */ +// repository.put(clientIp, channelHandlerContext.channel(), OnlineStateEnum.OFFLINE); // } - //心跳 - //注册 - //业务消息 + if (messageType.equals(MsgConstants.TERMINATOR_RESTART)) { + log.info("接受到终端重启命令,内容{}", messageContent); + } + + if (messageType.equals(MsgConstants.COLLECTOR_RESTART)) { + log.info("收到采集器重启命令,内容{}", messageContent); + } + + if (messageType.equals(MsgConstants.VIRTUAL_RESTART)) { + log.info("收到虚拟机重启命令,内容{}", messageContent); + } + + if (messageType.equals(MsgConstants.UPDATE_COLLECTOR_FILE)) { + log.info("收到更新采集器文件命令,内容{}", messageContent); + } + + if (messageType.equals(MsgConstants.UPDATE_COLLECTOR_CONFIG)) { + log.info("收到更新采集器配置命令,内容{}", messageContent); + } + + if (messageType.equals(MsgConstants.SCH_DISTRIBUTE_TASKS)) { + log.info("收到采集调度器下发任务命令,内容{}", messageContent); + } } @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { - Channel channel = ctx.channel(); + ctx.fireChannelRegistered(); + + InetSocketAddress ipSocket = (InetSocketAddress) ctx.channel().remoteAddress(); + String clientIp = ipSocket.getAddress().getHostAddress(); + log.info("【采集器-终端IP】:{},连接上线,IP地址信息:{}", clientIp, clientIp); + Channel channel = repository.get(clientIp); + if (channel != null && channel.isOpen()) { + channel.close(); + } - GROUP.add(channel); - System.out.println(channel.remoteAddress() + " 上线," + "在线数量:" + GROUP.size()); + repository.put(clientIp, ctx.channel(), OnlineStateEnum.OFFLINE); + + DEFAULT_CHANNEL_GROUP.add(ctx.channel()); + System.out.println(ctx.channel().remoteAddress() + " 上线," + "在线数量:" + DEFAULT_CHANNEL_GROUP.size()); } @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { - // 获取到当前要断开连接的Channel Channel channel = ctx.channel(); - System.out.println(channel.remoteAddress() + "下线," + "在线数量:" + GROUP.size()); + System.out.println(channel.remoteAddress() + " 下线," + "在线数量:" + DEFAULT_CHANNEL_GROUP.size()); } @Override @@ -118,6 +128,7 @@ public class NettyBusinessHandler extends SimpleChannelInboundHandler { if (channel.isActive()) { ctx.close(); } + super.exceptionCaught(ctx, cause); } diff --git a/collector-scheduling-management/src/main/java/com/docus/server/common/netty/server/handler/NettyHeartbeatHandler.java b/collector-scheduling-management/src/main/java/com/docus/server/common/netty/server/handler/NettyHeartbeatHandler.java index 904e2cf..bbac297 100644 --- a/collector-scheduling-management/src/main/java/com/docus/server/common/netty/server/handler/NettyHeartbeatHandler.java +++ b/collector-scheduling-management/src/main/java/com/docus/server/common/netty/server/handler/NettyHeartbeatHandler.java @@ -1,14 +1,21 @@ package com.docus.server.common.netty.server.handler; +import com.docus.core.util.StringUtils; +import com.docus.core.util.json.JSON; +import com.docus.server.common.MsgConstants; +import com.docus.server.common.netty.CommMsg; import com.docus.server.common.netty.server.ChannelRepository; +import com.docus.server.enums.OnlineStateEnum; +import com.fasterxml.jackson.core.type.TypeReference; +import io.netty.buffer.ByteBuf; +import io.netty.channel.Channel; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; -import io.netty.handler.timeout.IdleState; -import io.netty.handler.timeout.IdleStateEvent; -import io.netty.util.ReferenceCountUtil; import lombok.extern.slf4j.Slf4j; +import java.net.InetSocketAddress; + /** * 客户端和服务端心跳 */ @@ -17,19 +24,54 @@ import lombok.extern.slf4j.Slf4j; public class NettyHeartbeatHandler extends ChannelInboundHandlerAdapter { @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { -// Payload.Message message = (Payload.Message) msg; -// if (message.getCmd().equals(Payload.Message.type.HEARTBEAT_REQUEST)) { - log.info("接收到客户端的心跳"); -// } else { - if (ctx.channel().isOpen()) { - //触发下一个handler - ctx.fireChannelRead(msg); + public void channelRead(ChannelHandlerContext channelHandlerContext, Object msg) throws Exception { + ByteBuf buf = (ByteBuf) msg; + //创建目标大小的数组 + byte[] barray = new byte[buf.readableBytes()]; + //把数据从bytebuf转移到byte[] + buf.getBytes(0, barray); + //将byte[]转成字符串用于打印 + String message = new String(barray); + //空消息不处理 + if (!StringUtils.hasText(message)) { + return; } -// } - ReferenceCountUtil.release(msg); -// + CommMsg commMsg = JSON.fromJSONWithGeneric(message, new TypeReference>() { + }); + + String messageType = commMsg.getMessageType(); + String messageTime = commMsg.getMessageTime(); + TerminatorContent messageContent = commMsg.getContent(); + + if (messageType.equals(MsgConstants.HEARTBEAT_REQUEST)) { + + log.info("接收到客户端的心跳"); + + + log.info("接受到【采集器-终端】的心跳消息:消息类型={},消息时间={},消息内容={}", messageType, messageTime, messageContent); + + InetSocketAddress ipSocket = (InetSocketAddress) channelHandlerContext.channel().remoteAddress(); + String clientIp = ipSocket.getAddress().getHostAddress(); + + log.info("【采集器-终端IP】:{},连接上线,IP地址信息:{}", clientIp, clientIp); + + Channel channel = repository.get(clientIp); + if (channel != null && channel.isOpen()) { + channel.close(); + } + /* + * 将ip和channel进行映射 + */ + repository.put(clientIp, channelHandlerContext.channel(), OnlineStateEnum.ONLINE); + + } else { + if (channelHandlerContext.channel().isOpen()) { + //触发下一个handler + channelHandlerContext.fireChannelRead(msg); + } + } +// ReferenceCountUtil.release(msg); } private ChannelRepository repository; @@ -38,21 +80,21 @@ public class NettyHeartbeatHandler extends ChannelInboundHandlerAdapter { this.repository = repository; } - @Override - public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { - if (evt instanceof IdleStateEvent) { - IdleStateEvent event = (IdleStateEvent) evt; - if (event.state() == IdleState.READER_IDLE) { - String clientId = repository.getClientKey(ctx.channel()); - //移除工控机缓存,设备离线 - repository.remove(clientId); - log.info("{},关闭这个不活跃通道=================>", clientId); - ctx.channel().close(); - } - } else { - super.userEventTriggered(ctx, evt); - } - } +// @Override +// public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { +// if (evt instanceof IdleStateEvent) { +// IdleStateEvent event = (IdleStateEvent) evt; +// if (event.state() == IdleState.READER_IDLE) { +// String clientId = repository.getClientKey(ctx.channel()); +// //移除工控机缓存,设备离线 +// repository.remove(clientId); +// log.info("{},关闭这个不活跃通道=================>", clientId); +// ctx.channel().close(); +// } +// } else { +// super.userEventTriggered(ctx, evt); +// } +// } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { diff --git a/collector-scheduling-management/src/main/java/com/docus/server/common/netty/server/handler/TerminatorContent.java b/collector-scheduling-management/src/main/java/com/docus/server/common/netty/server/handler/TerminatorContent.java new file mode 100644 index 0000000..24e60b6 --- /dev/null +++ b/collector-scheduling-management/src/main/java/com/docus/server/common/netty/server/handler/TerminatorContent.java @@ -0,0 +1,22 @@ +package com.docus.server.common.netty.server.handler; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Data +public class TerminatorContent implements Serializable { + + /*终端IP*/ + private String terminatorIp; + + /*终端名称*/ + private String terminatorName; + +} diff --git a/collector-scheduling-management/src/main/java/com/docus/server/common/netty/server/handler/Test.java b/collector-scheduling-management/src/main/java/com/docus/server/common/netty/server/handler/Test.java deleted file mode 100644 index 32709cd..0000000 --- a/collector-scheduling-management/src/main/java/com/docus/server/common/netty/server/handler/Test.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.docus.server.common.netty.server.handler; - -import java.io.Serializable; - -public class Test implements Serializable { - private int age; - private String name; - - public Test() { - } - - public Test(int age, String name) { - this.age = age; - this.name = name; - } - - public int getAge() { - return age; - } - - public void setAge(int age) { - this.age = age; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } -} diff --git a/collector-scheduling-management/src/main/java/com/docus/server/convert/SchTerminatorConvert.java b/collector-scheduling-management/src/main/java/com/docus/server/convert/SchTerminatorConvert.java index 641acc6..a8cc823 100644 --- a/collector-scheduling-management/src/main/java/com/docus/server/convert/SchTerminatorConvert.java +++ b/collector-scheduling-management/src/main/java/com/docus/server/convert/SchTerminatorConvert.java @@ -1,12 +1,10 @@ package com.docus.server.convert; import com.docus.infrastructure.web.response.PageResult; -import com.docus.server.entity.scheduling.management.SchTerminator; import com.docus.server.dto.scheduling.management.schterminator.AddSchTerminatorDTO; import com.docus.server.dto.scheduling.management.schterminator.EditSchTerminatorDTO; -import com.docus.server.dto.scheduling.management.schterminator.DeleteSchTerminatorDTO; +import com.docus.server.entity.scheduling.management.SchTerminator; import com.docus.server.vo.scheduling.management.schterminator.SchTerminatorVO; - import org.mapstruct.Mapper; import org.mapstruct.Mappings; import org.mapstruct.factory.Mappers; diff --git a/collector-scheduling-management/src/main/java/com/docus/server/infrastructure/dao/impl/SchTerminatorDaoImpl.java b/collector-scheduling-management/src/main/java/com/docus/server/infrastructure/dao/impl/SchTerminatorDaoImpl.java index 26d697a..dfe4493 100644 --- a/collector-scheduling-management/src/main/java/com/docus/server/infrastructure/dao/impl/SchTerminatorDaoImpl.java +++ b/collector-scheduling-management/src/main/java/com/docus/server/infrastructure/dao/impl/SchTerminatorDaoImpl.java @@ -86,15 +86,12 @@ public class SchTerminatorDaoImpl extends BaseDaoImpl sub.like(SchTerminator::getxx1, searchDTO.getKeyword()) - // оr(). like(SchTerminator::getXX2, searchDTO.getKeyword())) - //); - //} + + //在线状态 + if (searchDTO.getParams("onlineState") != null) { + query.eq(SchTerminator::getOnlineState, searchDTO.getParams("onlineState")); + } + //默认createTime倒序排序 query.orderByDesc(SchTerminator::getCreateTime); List list = super.find(query); diff --git a/collector-scheduling-management/src/main/java/com/docus/server/service/ISchTerminatorService.java b/collector-scheduling-management/src/main/java/com/docus/server/service/ISchTerminatorService.java index d587d8f..27b2a44 100644 --- a/collector-scheduling-management/src/main/java/com/docus/server/service/ISchTerminatorService.java +++ b/collector-scheduling-management/src/main/java/com/docus/server/service/ISchTerminatorService.java @@ -5,6 +5,7 @@ import com.docus.infrastructure.web.response.PageResult; import com.docus.server.dto.scheduling.management.schterminator.AddSchTerminatorDTO; import com.docus.server.dto.scheduling.management.schterminator.DeleteSchTerminatorDTO; import com.docus.server.dto.scheduling.management.schterminator.EditSchTerminatorDTO; +import com.docus.server.enums.OnlineStateEnum; import com.docus.server.vo.scheduling.management.schterminator.SchTerminatorVO; /** @@ -53,4 +54,12 @@ public interface ISchTerminatorService { * @return 分页列表 */ PageResult search(SearchDTO searchDTO); + + /** + * 新增或更新 + * + * @param terminatorIp + * @param onlineState + */ + void saveOrUpdate(String terminatorIp, OnlineStateEnum onlineState); } diff --git a/collector-scheduling-management/src/main/java/com/docus/server/service/impl/SchTerminatorServiceImpl.java b/collector-scheduling-management/src/main/java/com/docus/server/service/impl/SchTerminatorServiceImpl.java index bff0718..23a8863 100644 --- a/collector-scheduling-management/src/main/java/com/docus/server/service/impl/SchTerminatorServiceImpl.java +++ b/collector-scheduling-management/src/main/java/com/docus/server/service/impl/SchTerminatorServiceImpl.java @@ -1,5 +1,7 @@ package com.docus.server.service.impl; +import com.docus.core.util.Func; +import com.docus.infrastructure.redis.service.IdService; import com.docus.infrastructure.web.request.SearchDTO; import com.docus.infrastructure.web.response.PageResult; import com.docus.server.convert.SchTerminatorConvert; @@ -7,12 +9,15 @@ import com.docus.server.dto.scheduling.management.schterminator.AddSchTerminator import com.docus.server.dto.scheduling.management.schterminator.DeleteSchTerminatorDTO; import com.docus.server.dto.scheduling.management.schterminator.EditSchTerminatorDTO; import com.docus.server.entity.scheduling.management.SchTerminator; +import com.docus.server.enums.BusyStateEnum; +import com.docus.server.enums.OnlineStateEnum; import com.docus.server.infrastructure.dao.ISchTerminatorDao; import com.docus.server.service.ISchTerminatorService; import com.docus.server.vo.scheduling.management.schterminator.SchTerminatorVO; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.util.Date; /** * 执行管理器 服务实现类 @@ -24,6 +29,8 @@ import javax.annotation.Resource; public class SchTerminatorServiceImpl implements ISchTerminatorService { @Resource private ISchTerminatorDao iSchTerminatorDao; + @Resource + private IdService idService; /** * 按主键查询 @@ -47,6 +54,31 @@ public class SchTerminatorServiceImpl implements ISchTerminatorService { return SchTerminatorConvert.INSTANCE.convertVO(iSchTerminatorDao.search(searchDTO)); } + @Override + public void saveOrUpdate(String terminatorIp, OnlineStateEnum onlineStateEnum) { + + SchTerminator schTerminator = iSchTerminatorDao.findOneBy("terminatorIp", terminatorIp); + + if (Func.isNull(schTerminator)) { + SchTerminator schTerminatorVO = new SchTerminator(); + + schTerminatorVO.setId(idService.getDateSeq()); + schTerminatorVO.setTerminatorIp(terminatorIp); + schTerminatorVO.setTerminatorName(terminatorIp); + schTerminatorVO.setOnlineState(onlineStateEnum); + schTerminatorVO.setBusyState(BusyStateEnum.IDLE); + + iSchTerminatorDao.save(schTerminatorVO); + } else { + + schTerminator.setBusyState(BusyStateEnum.IDLE); + schTerminator.setOnlineState(onlineStateEnum); + schTerminator.setUpdateTime(new Date()); + + iSchTerminatorDao.updateById(schTerminator); + } + } + /** * 新增 * diff --git a/docus-client-interface/src/main/java/com/docus/server/dto/scheduling.management/schterminator/AddSchTerminatorDTO.java b/docus-client-interface/src/main/java/com/docus/server/dto/scheduling.management/schterminator/AddSchTerminatorDTO.java index 8ffe9ca..47534ec 100644 --- a/docus-client-interface/src/main/java/com/docus/server/dto/scheduling.management/schterminator/AddSchTerminatorDTO.java +++ b/docus-client-interface/src/main/java/com/docus/server/dto/scheduling.management/schterminator/AddSchTerminatorDTO.java @@ -1,15 +1,16 @@ package com.docus.server.dto.scheduling.management.schterminator; +import com.baomidou.mybatisplus.annotation.TableField; +import com.docus.server.enums.BusyStateEnum; +import com.docus.server.enums.OnlineStateEnum; +import com.docus.server.enums.RestrictStateEnum; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import com.docus.server.enums.*; import java.io.Serializable; -import java.time.LocalDateTime; +import java.util.Date; /** * @@ -22,44 +23,59 @@ import java.time.LocalDateTime; @ApiModel(value="AddSchTerminatorDTO对象", description="执行管理器") public class AddSchTerminatorDTO implements Serializable { + @ApiModelProperty(value = "主键") private Long id; @ApiModelProperty(value = "终端IP") + @TableField("terminator_ip") private String terminatorIp; @ApiModelProperty(value = "资源管理器名称") + @TableField("terminator_name") private String terminatorName; @ApiModelProperty(value = "只干某些任务,任务偏好属性") + @TableField("only_collector_ids") private String onlyCollectorIds; @ApiModelProperty(value = "优先干某些任务,任务偏好属性(优先给哪个采集器,若不空闲再给任意采集器)") + @TableField("priority_collector_ids") private String priorityCollectorIds; @ApiModelProperty(value = "是否限制采集器类型,0:否,1:是") - private String restrictState; + @TableField("restrict_state") + private RestrictStateEnum restrictState; @ApiModelProperty(value = "忙闲状态,0:空闲,1:繁忙") - private String busyState; + @TableField("busy_state") + private BusyStateEnum busyState; @ApiModelProperty(value = "在线状态,0:离线,1:在线") - private String onlineState; + @TableField("online_state") + private OnlineStateEnum onlineState; @ApiModelProperty(value = "最近任务执行时间") - private LocalDateTime lastTaskExecTime; + @TableField("last_task_exec_time") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date lastTaskExecTime; @ApiModelProperty(value = "正在执行任务的名称") + @TableField("executing_task_name") private String executingTaskName; @ApiModelProperty(value = "最近一次任务执行失败原因") + @TableField("last_task_error_msg") private String lastTaskErrorMsg; @ApiModelProperty(value = "入库时间") - private LocalDateTime createTime; + @TableField("create_time") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; @ApiModelProperty(value = "入库更新时间") - private LocalDateTime updateTime; - + @TableField("update_time") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; } diff --git a/docus-client-interface/src/main/java/com/docus/server/dto/scheduling.management/schterminator/EditSchTerminatorDTO.java b/docus-client-interface/src/main/java/com/docus/server/dto/scheduling.management/schterminator/EditSchTerminatorDTO.java index a1a4730..8cdd07e 100644 --- a/docus-client-interface/src/main/java/com/docus/server/dto/scheduling.management/schterminator/EditSchTerminatorDTO.java +++ b/docus-client-interface/src/main/java/com/docus/server/dto/scheduling.management/schterminator/EditSchTerminatorDTO.java @@ -1,65 +1,80 @@ package com.docus.server.dto.scheduling.management.schterminator; +import com.baomidou.mybatisplus.annotation.TableField; +import com.docus.server.enums.BusyStateEnum; +import com.docus.server.enums.OnlineStateEnum; +import com.docus.server.enums.RestrictStateEnum; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import com.docus.server.enums.*; import java.io.Serializable; -import java.time.LocalDateTime; +import java.util.Date; /** -* -* 执行管理器 EditDTO -* -* @author AutoGenerator -* @since 2023-07-15 -*/ + * 执行管理器 EditDTO + * + * @author AutoGenerator + * @since 2023-07-15 + */ @Data -@ApiModel(value="EditSchTerminatorDTO对象", description="执行管理器") +@ApiModel(value = "EditSchTerminatorDTO对象", description = "执行管理器") public class EditSchTerminatorDTO implements Serializable { @ApiModelProperty(value = "主键") private Long id; @ApiModelProperty(value = "终端IP") + @TableField("terminator_ip") private String terminatorIp; @ApiModelProperty(value = "资源管理器名称") + @TableField("terminator_name") private String terminatorName; @ApiModelProperty(value = "只干某些任务,任务偏好属性") + @TableField("only_collector_ids") private String onlyCollectorIds; @ApiModelProperty(value = "优先干某些任务,任务偏好属性(优先给哪个采集器,若不空闲再给任意采集器)") + @TableField("priority_collector_ids") private String priorityCollectorIds; @ApiModelProperty(value = "是否限制采集器类型,0:否,1:是") - private String restrictState; + @TableField("restrict_state") + private RestrictStateEnum restrictState; @ApiModelProperty(value = "忙闲状态,0:空闲,1:繁忙") - private String busyState; + @TableField("busy_state") + private BusyStateEnum busyState; @ApiModelProperty(value = "在线状态,0:离线,1:在线") - private String onlineState; + @TableField("online_state") + private OnlineStateEnum onlineState; @ApiModelProperty(value = "最近任务执行时间") - private LocalDateTime lastTaskExecTime; + @TableField("last_task_exec_time") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date lastTaskExecTime; @ApiModelProperty(value = "正在执行任务的名称") + @TableField("executing_task_name") private String executingTaskName; @ApiModelProperty(value = "最近一次任务执行失败原因") + @TableField("last_task_error_msg") private String lastTaskErrorMsg; @ApiModelProperty(value = "入库时间") - private LocalDateTime createTime; + @TableField("create_time") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; @ApiModelProperty(value = "入库更新时间") - private LocalDateTime updateTime; + @TableField("update_time") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; } diff --git a/docus-client-interface/src/main/java/com/docus/server/entity/scheduling.management/SchTerminator.java b/docus-client-interface/src/main/java/com/docus/server/entity/scheduling.management/SchTerminator.java index 6261bca..301dd33 100644 --- a/docus-client-interface/src/main/java/com/docus/server/entity/scheduling.management/SchTerminator.java +++ b/docus-client-interface/src/main/java/com/docus/server/entity/scheduling.management/SchTerminator.java @@ -1,30 +1,31 @@ package com.docus.server.entity.scheduling.management; -import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import java.time.LocalDateTime; import com.baomidou.mybatisplus.annotation.TableField; -import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.docus.server.enums.BusyStateEnum; +import com.docus.server.enums.OnlineStateEnum; +import com.docus.server.enums.RestrictStateEnum; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; -import com.docus.server.enums.*; +import java.io.Serializable; +import java.util.Date; /** -* -* 执行管理器 -* -* @author AutoGenerator -* @since 2023-07-15 -*/ + * 执行管理器 + * + * @author AutoGenerator + * @since 2023-07-15 + */ @Data @EqualsAndHashCode(callSuper = false) @TableName("sch_terminator") -@ApiModel(value="SchTerminator对象", description="执行管理器") +@ApiModel(value = "SchTerminator对象", description = "执行管理器") public class SchTerminator implements Serializable { @ApiModelProperty(value = "主键") @@ -49,19 +50,20 @@ public class SchTerminator implements Serializable { @ApiModelProperty(value = "是否限制采集器类型,0:否,1:是") @TableField("restrict_state") - private String restrictState; + private RestrictStateEnum restrictState; @ApiModelProperty(value = "忙闲状态,0:空闲,1:繁忙") @TableField("busy_state") - private String busyState; + private BusyStateEnum busyState; @ApiModelProperty(value = "在线状态,0:离线,1:在线") @TableField("online_state") - private String onlineState; + private OnlineStateEnum onlineState; @ApiModelProperty(value = "最近任务执行时间") @TableField("last_task_exec_time") - private LocalDateTime lastTaskExecTime; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date lastTaskExecTime; @ApiModelProperty(value = "正在执行任务的名称") @TableField("executing_task_name") @@ -73,11 +75,13 @@ public class SchTerminator implements Serializable { @ApiModelProperty(value = "入库时间") @TableField("create_time") - private LocalDateTime createTime; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; @ApiModelProperty(value = "入库更新时间") @TableField("update_time") - private LocalDateTime updateTime; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; } diff --git a/docus-client-interface/src/main/java/com/docus/server/enums/BusyStateEnum.java b/docus-client-interface/src/main/java/com/docus/server/enums/BusyStateEnum.java new file mode 100644 index 0000000..961f93e --- /dev/null +++ b/docus-client-interface/src/main/java/com/docus/server/enums/BusyStateEnum.java @@ -0,0 +1,31 @@ +package com.docus.server.enums; + +import com.docus.infrastructure.core.db.enums.IIntegerEnum; + +/** + * 忙闲状态 + */ +public enum BusyStateEnum implements IIntegerEnum { + + IDLE(0, "空闲"), + + BUSY(1, "繁忙"); + + private Integer value; + private String display; + + BusyStateEnum(Integer value, String display) { + this.value = value; + this.display = display; + } + + @Override + public Integer getValue() { + return value; + } + + @Override + public String getDisplay() { + return display; + } +} diff --git a/docus-client-interface/src/main/java/com/docus/server/enums/OnlineStateEnum.java b/docus-client-interface/src/main/java/com/docus/server/enums/OnlineStateEnum.java new file mode 100644 index 0000000..9fcf7b3 --- /dev/null +++ b/docus-client-interface/src/main/java/com/docus/server/enums/OnlineStateEnum.java @@ -0,0 +1,31 @@ +package com.docus.server.enums; + +import com.docus.infrastructure.core.db.enums.IIntegerEnum; + +/** + * 在线状态 + */ +public enum OnlineStateEnum implements IIntegerEnum { + + OFFLINE(0, "离线"), + + ONLINE(1, "在线"); + + private Integer value; + private String display; + + OnlineStateEnum(Integer value, String display) { + this.value = value; + this.display = display; + } + + @Override + public Integer getValue() { + return value; + } + + @Override + public String getDisplay() { + return display; + } +} diff --git a/docus-client-interface/src/main/java/com/docus/server/enums/RestrictStateEnum.java b/docus-client-interface/src/main/java/com/docus/server/enums/RestrictStateEnum.java new file mode 100644 index 0000000..9bd9c6b --- /dev/null +++ b/docus-client-interface/src/main/java/com/docus/server/enums/RestrictStateEnum.java @@ -0,0 +1,31 @@ +package com.docus.server.enums; + +import com.docus.infrastructure.core.db.enums.IIntegerEnum; + +/** + * 是否限制采集器类型 + */ +public enum RestrictStateEnum implements IIntegerEnum { + + NO(0, "否"), + + YES(1, "是"); + + private Integer value; + private String display; + + RestrictStateEnum(Integer value, String display) { + this.value = value; + this.display = display; + } + + @Override + public Integer getValue() { + return value; + } + + @Override + public String getDisplay() { + return display; + } +} diff --git a/docus-client-interface/src/main/java/com/docus/server/vo/scheduling.management/schterminator/SchTerminatorVO.java b/docus-client-interface/src/main/java/com/docus/server/vo/scheduling.management/schterminator/SchTerminatorVO.java index 6abcf38..028fe57 100644 --- a/docus-client-interface/src/main/java/com/docus/server/vo/scheduling.management/schterminator/SchTerminatorVO.java +++ b/docus-client-interface/src/main/java/com/docus/server/vo/scheduling.management/schterminator/SchTerminatorVO.java @@ -1,65 +1,79 @@ package com.docus.server.vo.scheduling.management.schterminator; +import com.baomidou.mybatisplus.annotation.TableField; +import com.docus.server.enums.BusyStateEnum; +import com.docus.server.enums.OnlineStateEnum; +import com.docus.server.enums.RestrictStateEnum; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import com.docus.server.enums.*; import java.io.Serializable; -import java.time.LocalDateTime; +import java.util.Date; /** -* -* 执行管理器 VO -* -* @author AutoGenerator -* @since 2023-07-15 -*/ + * 执行管理器 VO + * + * @author AutoGenerator + * @since 2023-07-15 + */ @Data -@ApiModel(value="SchTerminatorVO对象", description="执行管理器") +@ApiModel(value = "SchTerminatorVO对象", description = "执行管理器") public class SchTerminatorVO implements Serializable { @ApiModelProperty(value = "主键") private Long id; @ApiModelProperty(value = "终端IP") + @TableField("terminator_ip") private String terminatorIp; @ApiModelProperty(value = "资源管理器名称") + @TableField("terminator_name") private String terminatorName; @ApiModelProperty(value = "只干某些任务,任务偏好属性") + @TableField("only_collector_ids") private String onlyCollectorIds; @ApiModelProperty(value = "优先干某些任务,任务偏好属性(优先给哪个采集器,若不空闲再给任意采集器)") + @TableField("priority_collector_ids") private String priorityCollectorIds; @ApiModelProperty(value = "是否限制采集器类型,0:否,1:是") - private String restrictState; + @TableField("restrict_state") + private RestrictStateEnum restrictState; @ApiModelProperty(value = "忙闲状态,0:空闲,1:繁忙") - private String busyState; + @TableField("busy_state") + private BusyStateEnum busyState; @ApiModelProperty(value = "在线状态,0:离线,1:在线") - private String onlineState; + @TableField("online_state") + private OnlineStateEnum onlineState; @ApiModelProperty(value = "最近任务执行时间") - private LocalDateTime lastTaskExecTime; + @TableField("last_task_exec_time") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date lastTaskExecTime; @ApiModelProperty(value = "正在执行任务的名称") + @TableField("executing_task_name") private String executingTaskName; @ApiModelProperty(value = "最近一次任务执行失败原因") + @TableField("last_task_error_msg") private String lastTaskErrorMsg; @ApiModelProperty(value = "入库时间") - private LocalDateTime createTime; + @TableField("create_time") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; @ApiModelProperty(value = "入库更新时间") - private LocalDateTime updateTime; - + @TableField("update_time") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; }