Browse Source

fix:设备指令反馈改为事件方式

master
白凤吉 3 months ago
parent
commit
72d689b6a5
  1. 16
      src/main/java/com/iflytop/gd/app/core/event/CommandFeedbackEvent.java
  2. 18
      src/main/java/com/iflytop/gd/app/core/listener/CommandFeedbackListener.java
  3. 28
      src/main/java/com/iflytop/gd/hardware/HardwareService.java

16
src/main/java/com/iflytop/gd/app/core/event/CommandFeedbackEvent.java

@ -0,0 +1,16 @@
package com.iflytop.gd.app.core.event;
import cn.hutool.json.JSONObject;
import lombok.Getter;
import org.springframework.context.ApplicationEvent;
@Getter
public class CommandFeedbackEvent extends ApplicationEvent {
private final JSONObject jsonResponse;
public CommandFeedbackEvent(Object source, JSONObject jsonResponse) {
super(source);
this.jsonResponse = jsonResponse;
}
}

18
src/main/java/com/iflytop/gd/app/core/listener/CommandFeedbackListener.java

@ -0,0 +1,18 @@
package com.iflytop.gd.app.core.listener;
import com.iflytop.gd.app.core.event.CommandFeedbackEvent;
import com.iflytop.gd.app.service.DeviceCommandService;
import lombok.RequiredArgsConstructor;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor
public class CommandFeedbackListener {
private final DeviceCommandService deviceCommandService;
@EventListener
public void handleCommandFeedbackEvent(CommandFeedbackEvent event) {
deviceCommandService.completeCommandResponse(event.getJsonResponse());
}
}

28
src/main/java/com/iflytop/gd/hardware/HardwareService.java

@ -5,7 +5,7 @@ import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.iflytop.gd.app.service.DeviceCommandService;
import com.iflytop.gd.app.core.event.CommandFeedbackEvent;
import com.iflytop.gd.common.cmd.DeviceCommand;
import com.iflytop.gd.common.enums.cmd.CmdDevice;
import com.iflytop.gd.hardware.command.CommandHandler;
@ -14,12 +14,12 @@ import com.iflytop.gd.hardware.command.checker.SupportMethod;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;
import java.security.InvalidParameterException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
@ -27,20 +27,18 @@ import java.util.concurrent.ThreadPoolExecutor;
@Component
@RequiredArgsConstructor
public class HardwareService {
private final DeviceCommandService deviceCommandService;
private final ApplicationEventPublisher eventPublisher;
private final Map<CmdDevice, CommandHandler> cmdHandlers = new HashMap<>();
ThreadPoolExecutor executor = ThreadUtil.newFixedExecutor(50, "hardware-service", true);
@PostConstruct
public void postInit()
{
public void postInit() {
}
public boolean sendCommand(DeviceCommand cmd)
{
public boolean sendCommand(DeviceCommand cmd) {
if (executor.getQueue().remainingCapacity() == 0) {
log.error("线程池队列已满,无法提交任务");
return false;
@ -49,8 +47,7 @@ public class HardwareService {
return true;
}
void handleCommand(DeviceCommand cmd)
{
void handleCommand(DeviceCommand cmd) {
DeviceResponse response = new DeviceResponse();
response.setCmdId(cmd.getCmdId());
try {
@ -58,21 +55,18 @@ public class HardwareService {
SupportMethod.checkMethod(strMethod);
if(cmdHandlers.containsKey(cmd.getDevice())) {
if (cmdHandlers.containsKey(cmd.getDevice())) {
cmdHandlers.get(cmd.getDevice()).sendCommand(cmd);
response.setSuccess(Boolean.TRUE);
}
else {
} else {
throw new InvalidParameterException(StrUtil.format("[Device]: {}", cmd.getDevice()));
}
}
catch (Exception e) {
} catch (Exception e) {
response.setSuccess(Boolean.FALSE);
}
finally {
} finally {
JSONObject jsonResponse = JSONUtil.parseObj(response);
deviceCommandService.completeCommandResponse(jsonResponse);
eventPublisher.publishEvent(new CommandFeedbackEvent(this, jsonResponse));
}
}
}
Loading…
Cancel
Save