Browse Source

流式接口

master
白凤吉 5 months ago
parent
commit
ac68f47975
  1. 12
      src/main/java/com/qyft/ms/app/common/annotation/CommandMapping.java
  2. 23
      src/main/java/com/qyft/ms/app/config/AsyncConfig.java
  3. 96
      src/main/java/com/qyft/ms/app/controller/FrontCmdController.java
  4. 8
      src/main/java/com/qyft/ms/app/controller/frontcommandhandle/CommandHandler.java
  5. 52
      src/main/java/com/qyft/ms/app/controller/frontcommandhandle/SprayPipelineWash.java
  6. 49
      src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/DehumidifierStart.java
  7. 3
      src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/MatrixSprayChangeParam.java
  8. 2
      src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/MatrixSprayContinue.java
  9. 2
      src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/MatrixSprayPause.java
  10. 2
      src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/MatrixSprayStart.java
  11. 2
      src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/MatrixSprayStop.java
  12. 2
      src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/NozzlePipelinePreFill.java
  13. 2
      src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/SlideTrayIn.java
  14. 2
      src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/SlideTrayOut.java
  15. 46
      src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/SprayPipelineWash.java
  16. 2
      src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/SyringePipelineWash.java
  17. 47
      src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/TestDemoHandler.java
  18. 43
      src/main/java/com/qyft/ms/app/core/registry/CommandHandlerRegistry.java
  19. 8
      src/main/java/com/qyft/ms/device/client/TcpClient.java

12
src/main/java/com/qyft/ms/app/common/annotation/CommandMapping.java

@ -0,0 +1,12 @@
package com.qyft.ms.app.common.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface CommandMapping {
String value();
}

23
src/main/java/com/qyft/ms/app/config/AsyncConfig.java

@ -0,0 +1,23 @@
package com.qyft.ms.app.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
@Configuration
@EnableAsync
public class AsyncConfig {
// 可选配置线程池 Bean
@Bean("asyncExecutor")
public Executor asyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(25);
executor.initialize();
return executor;
}
}

96
src/main/java/com/qyft/ms/app/controller/FrontCmdController.java

@ -1,14 +1,18 @@
package com.qyft.ms.app.controller;
import com.qyft.ms.app.common.command.CurrentSendCmdMapInstance;
import com.qyft.ms.app.controller.frontcommandhandle.DehumidifierStart;
import com.qyft.ms.app.controller.frontcommandhandle.CommandHandler;
import com.qyft.ms.app.core.registry.CommandHandlerRegistry;
import com.qyft.ms.app.model.form.CMDFormV2;
import com.qyft.ms.device.service.DeviceTcpCMDServiceV2;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;
@Tag(name = "前端调用指令")
@ -17,50 +21,70 @@ import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter
@RequiredArgsConstructor
@Slf4j
public class FrontCmdController {
private final DeviceTcpCMDServiceV2 deviceTcpCMDServiceV2;
private final CommandHandlerRegistry registry;
@Operation(summary = "前端统一调用一个接口")
@PostMapping("/control")
public ResponseBodyEmitter controlMethod(@RequestBody CMDFormV2 cmdForm) {
ResponseBodyEmitter emitter = new ResponseBodyEmitter();
String frontCmdName = cmdForm.getCmdName();
if ("device_status_get".equals(frontCmdName)) {
DehumidifierStart.handle(deviceTcpCMDServiceV2, emitter, cmdForm);
} else if ("dehumidifier_start".equals(frontCmdName)) {
/*
除湿该方法接收Double类型参数 humidity
*/
} else if ("matrix_prefill".equals(frontCmdName)) {
} else if ("spray_pipeline_wash".equals(frontCmdName)) {
} else if ("syringe_pipeline_wash".equals(frontCmdName)) {
} else if ("matrix_spray_start".equals(frontCmdName)) {
} else if ("matrix_spray_change_param".equals(frontCmdName)) {
} else if ("matrix_spray_stop".equals(frontCmdName)) {
} else if ("matrix_spray_pause".equals(frontCmdName)) {
} else if ("matrix_spray_continue".equals(frontCmdName)) {
} else if ("slide_tray_in".equals(frontCmdName)) {
} else if ("slide_tray_out".equals(frontCmdName)) {
String frontCmdName = cmdForm.getCmdName(); // 获取前端传入的命令字符串
CommandHandler handler = registry.getHandler(frontCmdName);
if (handler != null) {
handler.handle(cmdForm, emitter);
} else {
try {
emitter.send("未找到对应的业务指令: " + frontCmdName);
emitter.complete();
} catch (Exception e) {
emitter.completeWithError(e);
}
}
return emitter;
}
// @Operation(summary = "前端统一调用一个接口")
// @PostMapping("/control")
// public ResponseBodyEmitter controlMethod(@RequestBody CMDFormV2 cmdForm) {
// ResponseBodyEmitter emitter = new ResponseBodyEmitter();
// String frontCmdName = cmdForm.getCmdName();
//
// if ("device_status_get".equals(frontCmdName)) {
//
//
// } else if ("dehumidifier_start".equals(frontCmdName)) {
// /*
// 除湿该方法接收Double类型参数 humidity
// */
// DehumidifierStart dehumidifierStart = new DehumidifierStart();
// DehumidifierStart.handle(deviceTcpCMDServiceV2, emitter, cmdForm);
//
// } else if ("matrix_prefill".equals(frontCmdName)) {
//
// } else if ("spray_pipeline_wash".equals(frontCmdName)) {
//
// } else if ("syringe_pipeline_wash".equals(frontCmdName)) {
//
// } else if ("matrix_spray_start".equals(frontCmdName)) {
//
// } else if ("matrix_spray_change_param".equals(frontCmdName)) {
//
// } else if ("matrix_spray_stop".equals(frontCmdName)) {
//
// } else if ("matrix_spray_pause".equals(frontCmdName)) {
//
// } else if ("matrix_spray_continue".equals(frontCmdName)) {
//
// } else if ("slide_tray_in".equals(frontCmdName)) {
//
// } else if ("slide_tray_out".equals(frontCmdName)) {
//
// }
//
// return emitter;
// }
@RequestMapping("/controlTest")
public void controlMethodTest() {

8
src/main/java/com/qyft/ms/app/controller/frontcommandhandle/CommandHandler.java

@ -0,0 +1,8 @@
package com.qyft.ms.app.controller.frontcommandhandle;
import com.qyft.ms.app.model.form.CMDFormV2;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;
public interface CommandHandler {
void handle(CMDFormV2 cmdForm, ResponseBodyEmitter emitter);
}

52
src/main/java/com/qyft/ms/app/controller/frontcommandhandle/SprayPipelineWash.java

@ -1,52 +0,0 @@
package com.qyft.ms.app.controller.frontcommandhandle;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.qyft.ms.app.common.command.CommandFuture;
import com.qyft.ms.app.common.command.CurrentSendCmdMapInstance;
import com.qyft.ms.app.common.command.DeviceCommandGenerator;
import com.qyft.ms.app.common.command.FrontCommandAck;
import com.qyft.ms.app.common.constant.CommandStatus;
import com.qyft.ms.app.model.bo.CMDToDevice;
import com.qyft.ms.app.model.form.CMDFormV2;
import com.qyft.ms.device.service.DeviceTcpCMDServiceV2;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;
import java.io.IOException;
import java.util.Map;
/**
* 处理前端清洗喷嘴管路
*/
public class SprayPipelineWash {
public static void handle(DeviceTcpCMDServiceV2 deviceTcpCMDServiceV2, ResponseBodyEmitter emitter, CMDFormV2 cmdForm) {
String frontCmdId = cmdForm.getCmdId();
String frontCmdName = cmdForm.getCmdName();
Map<String, Object> param = cmdForm.getParam();
new Thread(() -> {
try {
//向前端发送接收到指令
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令"), MediaType.APPLICATION_JSON);
} catch (IOException e) {
emitter.completeWithError(e);
}
}).start();
//对返回结果处理
emitter.complete();
}
}

49
src/main/java/com/qyft/ms/app/controller/frontcommandhandle/DehumidifierStart.java → src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/DehumidifierStart.java

@ -1,31 +1,41 @@
package com.qyft.ms.app.controller.frontcommandhandle;
package com.qyft.ms.app.controller.frontcommandhandle.impl;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.qyft.ms.app.common.annotation.CommandMapping;
import com.qyft.ms.app.common.command.CommandFuture;
import com.qyft.ms.app.common.command.CurrentSendCmdMapInstance;
import com.qyft.ms.app.common.command.FrontCommandAck;
import com.qyft.ms.app.common.command.DeviceCommandGenerator;
import com.qyft.ms.app.common.command.FrontCommandAck;
import com.qyft.ms.app.common.constant.CommandStatus;
import com.qyft.ms.app.controller.frontcommandhandle.CommandHandler;
import com.qyft.ms.app.model.bo.CMDToDevice;
import com.qyft.ms.app.model.form.CMDFormV2;
import com.qyft.ms.device.service.DeviceTcpCMDServiceV2;
import com.qyft.ms.device.client.TcpClient;
import lombok.RequiredArgsConstructor;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;
import java.io.IOException;
import java.util.Map;
public class DehumidifierStart {
public static void handle(DeviceTcpCMDServiceV2 deviceTcpCMDServiceV2, ResponseBodyEmitter emitter, CMDFormV2 cmdForm) {
@Component
@RequiredArgsConstructor
@CommandMapping("dehumidifier_start")//指令
public class DehumidifierStart implements CommandHandler {
/**
* 设备通信client
*/
private final TcpClient deviceClient;
@Override
public void handle(CMDFormV2 cmdForm, ResponseBodyEmitter emitter) {
String frontCmdId = cmdForm.getCmdId();
String frontCmdName = cmdForm.getCmdName();
Map<String, Object> param = cmdForm.getParam();
new Thread(() -> {
try {
//向前端发送接收到指令
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令"), MediaType.APPLICATION_JSON);
@ -50,14 +60,13 @@ public class DehumidifierStart {
humidityGetFuture.setCmdToDevice(humidityCmdToDevice);
Integer toDeviceCmdId = humidityCmdToDevice.getCmdId();
CurrentSendCmdMapInstance.getInstance().putCommand(toDeviceCmdId, humidityGetFuture);//将指令放入map
deviceTcpCMDServiceV2.send(humidityCmdToDevice); //发送指令给设备
deviceClient.sendToJSON(humidityCmdToDevice); //发送指令给设备
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.SEND, "已向设备发送了获取湿度指令:" + JSONUtil.toJsonStr(humidityCmdToDevice)), MediaType.APPLICATION_JSON);
humidityGetFuture.waitForContinue();//等待设备的反馈
/**
* 3处理返回结果或者没有响应
*/
@ -75,8 +84,7 @@ public class DehumidifierStart {
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.ERROR, "设定湿度大于当前湿度,无需除湿。"), MediaType.APPLICATION_JSON);
}
else{
} else {
/**
* 4如果大于设置值开始除湿;打开除湿阀门
@ -87,7 +95,7 @@ public class DehumidifierStart {
humidityGetFuture.setCmdToDevice(dehumidifier_valve_control);
Integer dehumidifier_valve_control_cmdId = dehumidifier_valve_control.getCmdId();
CurrentSendCmdMapInstance.getInstance().putCommand(dehumidifier_valve_control_cmdId, dehumidifier_valve_control_Future);//将指令放入map
deviceTcpCMDServiceV2.send(dehumidifier_valve_control); //发送指令给设备
deviceClient.sendToJSON(dehumidifier_valve_control); //发送指令给设备
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.SEND, "已向设备发送了开启除湿阀指令:" + JSONUtil.toJsonStr(dehumidifier_valve_control)), MediaType.APPLICATION_JSON);
@ -103,18 +111,13 @@ public class DehumidifierStart {
//设备已经收到指令并且执行成功
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RESULT, "开启除湿阀指令指令设备反馈:" + JSONUtil.toJsonStr(dehumidifier_valve_control_result)), MediaType.APPLICATION_JSON);
}
else{
} else {
//设备未收到指令或者执行失败
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.ERROR, "开启除湿阀指令没有响应:" + JSONUtil.toJsonStr(deviceResult)), MediaType.APPLICATION_JSON);
}
}
} else {
@ -125,19 +128,11 @@ public class DehumidifierStart {
}
} catch (IOException e) {
emitter.completeWithError(e);
}
}).start();
//对返回结果处理
emitter.complete();
}).start();
}
}

3
src/main/java/com/qyft/ms/app/controller/frontcommandhandle/MatrixSprayChangeParam.java → src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/MatrixSprayChangeParam.java

@ -1,9 +1,8 @@
package com.qyft.ms.app.controller.frontcommandhandle;
package com.qyft.ms.app.controller.frontcommandhandle.impl;
import com.qyft.ms.app.common.command.FrontCommandAck;
import com.qyft.ms.app.common.constant.CommandStatus;
import com.qyft.ms.app.model.form.CMDFormV2;
import com.qyft.ms.device.device.DeviceInstance;
import com.qyft.ms.device.service.DeviceTcpCMDServiceV2;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;

2
src/main/java/com/qyft/ms/app/controller/frontcommandhandle/MatrixSprayContinue.java → src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/MatrixSprayContinue.java

@ -1,4 +1,4 @@
package com.qyft.ms.app.controller.frontcommandhandle;
package com.qyft.ms.app.controller.frontcommandhandle.impl;
import com.qyft.ms.app.common.command.FrontCommandAck;
import com.qyft.ms.app.common.constant.CommandStatus;

2
src/main/java/com/qyft/ms/app/controller/frontcommandhandle/MatrixSprayPause.java → src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/MatrixSprayPause.java

@ -1,4 +1,4 @@
package com.qyft.ms.app.controller.frontcommandhandle;
package com.qyft.ms.app.controller.frontcommandhandle.impl;
import com.qyft.ms.app.common.command.FrontCommandAck;
import com.qyft.ms.app.common.constant.CommandStatus;

2
src/main/java/com/qyft/ms/app/controller/frontcommandhandle/MatrixSprayStart.java → src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/MatrixSprayStart.java

@ -1,4 +1,4 @@
package com.qyft.ms.app.controller.frontcommandhandle;
package com.qyft.ms.app.controller.frontcommandhandle.impl;
import com.qyft.ms.app.common.command.FrontCommandAck;
import com.qyft.ms.app.common.constant.CommandStatus;

2
src/main/java/com/qyft/ms/app/controller/frontcommandhandle/MatrixSprayStop.java → src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/MatrixSprayStop.java

@ -1,4 +1,4 @@
package com.qyft.ms.app.controller.frontcommandhandle;
package com.qyft.ms.app.controller.frontcommandhandle.impl;
import com.qyft.ms.app.common.command.FrontCommandAck;
import com.qyft.ms.app.common.constant.CommandStatus;

2
src/main/java/com/qyft/ms/app/controller/frontcommandhandle/NozzlePipelinePreFill.java → src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/NozzlePipelinePreFill.java

@ -1,4 +1,4 @@
package com.qyft.ms.app.controller.frontcommandhandle;
package com.qyft.ms.app.controller.frontcommandhandle.impl;
import com.qyft.ms.app.common.command.FrontCommandAck;
import com.qyft.ms.app.common.constant.CommandStatus;

2
src/main/java/com/qyft/ms/app/controller/frontcommandhandle/SlideTrayIn.java → src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/SlideTrayIn.java

@ -1,4 +1,4 @@
package com.qyft.ms.app.controller.frontcommandhandle;
package com.qyft.ms.app.controller.frontcommandhandle.impl;
import com.qyft.ms.app.common.command.FrontCommandAck;
import com.qyft.ms.app.common.constant.CommandStatus;

2
src/main/java/com/qyft/ms/app/controller/frontcommandhandle/SlideTrayOut.java → src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/SlideTrayOut.java

@ -1,4 +1,4 @@
package com.qyft.ms.app.controller.frontcommandhandle;
package com.qyft.ms.app.controller.frontcommandhandle.impl;
import com.qyft.ms.app.common.command.FrontCommandAck;
import com.qyft.ms.app.common.constant.CommandStatus;

46
src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/SprayPipelineWash.java

@ -0,0 +1,46 @@
package com.qyft.ms.app.controller.frontcommandhandle.impl;
import com.qyft.ms.app.common.command.FrontCommandAck;
import com.qyft.ms.app.common.constant.CommandStatus;
import com.qyft.ms.app.model.form.CMDFormV2;
import com.qyft.ms.device.service.DeviceTcpCMDServiceV2;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;
import java.io.IOException;
import java.util.Map;
/**
* 处理前端清洗喷嘴管路
*/
public class SprayPipelineWash {
public static void handle(DeviceTcpCMDServiceV2 deviceTcpCMDServiceV2, ResponseBodyEmitter emitter, CMDFormV2 cmdForm) {
String frontCmdId = cmdForm.getCmdId();
String frontCmdName = cmdForm.getCmdName();
Map<String, Object> param = cmdForm.getParam();
new Thread(() -> {
try {
//向前端发送接收到指令
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令"), MediaType.APPLICATION_JSON);
} catch (IOException e) {
emitter.completeWithError(e);
}
}).start();
//对返回结果处理
emitter.complete();
}
}

2
src/main/java/com/qyft/ms/app/controller/frontcommandhandle/SyringePipelineWash.java → src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/SyringePipelineWash.java

@ -1,4 +1,4 @@
package com.qyft.ms.app.controller.frontcommandhandle;
package com.qyft.ms.app.controller.frontcommandhandle.impl;
import com.qyft.ms.app.common.command.FrontCommandAck;
import com.qyft.ms.app.common.constant.CommandStatus;

47
src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/TestDemoHandler.java

@ -0,0 +1,47 @@
package com.qyft.ms.app.controller.frontcommandhandle.impl;
import cn.hutool.json.JSONUtil;
import com.qyft.ms.app.common.annotation.CommandMapping;
import com.qyft.ms.app.common.command.FrontCommandAck;
import com.qyft.ms.app.common.constant.CommandStatus;
import com.qyft.ms.app.controller.frontcommandhandle.CommandHandler;
import com.qyft.ms.app.model.form.CMDFormV2;
import com.qyft.ms.device.client.TcpClient;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;
@Slf4j
@Component
@RequiredArgsConstructor
@CommandMapping("test_test")//指令
public class TestDemoHandler implements CommandHandler {
/**
* 设备通信client
*/
private final TcpClient deviceClient;
@Override
public void handle(CMDFormV2 cmdForm, ResponseBodyEmitter emitter) {
asyncHandle(cmdForm, emitter);
}
@Async("asyncExecutor")
public void asyncHandle(CMDFormV2 cmdForm, ResponseBodyEmitter emitter) {
String frontCmdId = cmdForm.getCmdId();
String frontCmdName = cmdForm.getCmdName();
try {
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令1"), MediaType.APPLICATION_JSON);
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令2"), MediaType.APPLICATION_JSON);
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令3"), MediaType.APPLICATION_JSON);
} catch (Exception e) {
log.error("指令执行失败:{}", JSONUtil.toJsonStr(cmdForm), e);
emitter.completeWithError(e);
return;
}
emitter.complete();
}
}

43
src/main/java/com/qyft/ms/app/core/registry/CommandHandlerRegistry.java

@ -0,0 +1,43 @@
package com.qyft.ms.app.core.registry;
import com.qyft.ms.app.common.annotation.CommandMapping;
import com.qyft.ms.app.controller.frontcommandhandle.CommandHandler;
import io.micrometer.common.lang.NonNull;
import jakarta.annotation.PostConstruct;
import org.springframework.aop.support.AopUtils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Component
public class CommandHandlerRegistry implements ApplicationContextAware {
private ApplicationContext applicationContext;
private final Map<String, CommandHandler> handlerMap = new HashMap<>();
@Override
public void setApplicationContext(@NonNull ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
@PostConstruct
public void init() {
Map<String, Object> beans = applicationContext.getBeansWithAnnotation(CommandMapping.class);
for (Object bean : beans.values()) {
// 获取实际目标类而不是代理类
Class<?> targetClass = AopUtils.getTargetClass(bean);
CommandMapping mapping = targetClass.getAnnotation(CommandMapping.class);
if (mapping != null && bean instanceof CommandHandler) {
handlerMap.put(mapping.value(), (CommandHandler) bean);
}
}
}
public CommandHandler getHandler(String command) {
return handlerMap.get(command);
}
}

8
src/main/java/com/qyft/ms/device/client/TcpClient.java

@ -101,6 +101,14 @@ public class TcpClient {
}
}
/**
* 将obj转换成json后发送
*/
public boolean sendToJSON(Object request) {
String msg = JSONUtil.toJsonStr(request);
return this.send(msg);
}
// 发送字符串请求到TCP服务器的方法
public boolean send(String request) {
if (channel != null && channel.isActive()) {

Loading…
Cancel
Save