Browse Source

feat:停止喷涂

master
白凤吉 5 months ago
parent
commit
f3cd5658e6
  1. 53
      src/main/java/com/qyft/ms/app/handler/MatrixSprayState.java
  2. 29
      src/main/java/com/qyft/ms/app/handler/impl/MatrixSprayStart.java
  3. 1
      src/main/java/com/qyft/ms/app/handler/impl/MatrixSprayStop.java

53
src/main/java/com/qyft/ms/app/handler/MatrixSprayState.java

@ -4,6 +4,11 @@ package com.qyft.ms.app.handler;
import lombok.Data; import lombok.Data;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
@Component @Component
@Data @Data
public class MatrixSprayState { public class MatrixSprayState {
@ -12,4 +17,52 @@ public class MatrixSprayState {
*/ */
private Double targetX = null; private Double targetX = null;
private Double targetY = null; private Double targetY = null;
// 用于提交任务的线程池
private final ExecutorService executorService = Executors.newSingleThreadExecutor();
// 保存当前任务的 Future 对象
private volatile Future<?> taskFuture;
// 停止任务的标志volatile 保证多线程可见性
private volatile boolean stopRequested = false;
// 重置状态启动任务前调用
public void reset() {
stopRequested = false;
}
// 请求停止任务
public void requestStop() {
this.stopRequested = true;
}
/**
* 启动一个异步任务并保存其 Future 对象
* @param task 需要异步执行的任务
*/
public void startTask(Runnable task) {
reset();
taskFuture = executorService.submit(task);
}
/**
* 取消当前任务设置停止标志并尝试调用 Future.cancel(true)
* @return 取消结果信息
*/
public String cancelTask() {
requestStop();
if (taskFuture != null && !taskFuture.isDone()) {
boolean cancelled = taskFuture.cancel(true);
return cancelled ? "任务停止请求已发送" : "任务取消失败";
}
return "当前没有正在运行的任务";
}
/**
* 关闭线程池如在程序退出时调用
*/
public void shutdown() {
executorService.shutdown();
}
} }

29
src/main/java/com/qyft/ms/app/handler/impl/MatrixSprayStart.java

@ -9,6 +9,7 @@ import com.qyft.ms.app.common.command.FrontCommandAck;
import com.qyft.ms.app.common.constant.CommandStatus; import com.qyft.ms.app.common.constant.CommandStatus;
import com.qyft.ms.app.common.generator.PathGenerator; import com.qyft.ms.app.common.generator.PathGenerator;
import com.qyft.ms.app.handler.CommandHandler; import com.qyft.ms.app.handler.CommandHandler;
import com.qyft.ms.app.handler.MatrixSprayState;
import com.qyft.ms.app.model.bo.CMDToDevice; import com.qyft.ms.app.model.bo.CMDToDevice;
import com.qyft.ms.app.model.form.CMDFormV2; import com.qyft.ms.app.model.form.CMDFormV2;
import com.qyft.ms.device.client.TcpClient; import com.qyft.ms.device.client.TcpClient;
@ -16,7 +17,6 @@ import com.qyft.ms.device.handler.DeviceMessageHandler;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;
@ -34,7 +34,7 @@ import java.util.concurrent.TimeoutException;
@Slf4j @Slf4j
@Component @Component
@RequiredArgsConstructor @RequiredArgsConstructor
@Async("asyncExecutor")
//@Async("asyncExecutor")
@CommandMapping("matrix_spray_start")//业务指令注解 @CommandMapping("matrix_spray_start")//业务指令注解
public class MatrixSprayStart implements CommandHandler { public class MatrixSprayStart implements CommandHandler {
@ -42,6 +42,8 @@ public class MatrixSprayStart implements CommandHandler {
private final DeviceMessageHandler deviceMessageHandler; private final DeviceMessageHandler deviceMessageHandler;
private final MatrixSprayState matrixSprayState;
/** /**
* { * {
* cmdName:'matrix_spray_start' * cmdName:'matrix_spray_start'
@ -62,10 +64,14 @@ public class MatrixSprayStart implements CommandHandler {
*/ */
@Override @Override
public void handle(CMDFormV2 cmdForm, ResponseBodyEmitter emitter) throws Exception { public void handle(CMDFormV2 cmdForm, ResponseBodyEmitter emitter) throws Exception {
log.info("申请中断喷涂线程:{}", matrixSprayState.cancelTask());
matrixSprayState.startTask(() -> {
try {
String frontCmdId = cmdForm.getCmdId(); String frontCmdId = cmdForm.getCmdId();
String frontCmdName = cmdForm.getCmdName(); String frontCmdName = cmdForm.getCmdName();
Map<String, Object> param = cmdForm.getParam(); Map<String, Object> param = cmdForm.getParam();
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令"), MediaType.APPLICATION_JSON);//向前端发送接收到指令 emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令"), MediaType.APPLICATION_JSON);//向前端发送接收到指令
// 1. 参数校验 // 1. 参数校验
String matrixPathType = Optional.ofNullable(param.get("matrixPathType")) String matrixPathType = Optional.ofNullable(param.get("matrixPathType"))
.map(Object::toString) .map(Object::toString)
@ -226,7 +232,8 @@ public class MatrixSprayStart implements CommandHandler {
spacing, spacing,
PathGenerator.MoveMode.HORIZONTAL_ZIGZAG_TOP_DOWN PathGenerator.MoveMode.HORIZONTAL_ZIGZAG_TOP_DOWN
); );
if (pathSpray(emitter, frontCmdId, frontCmdName, volume, pathList, movingSpeed)) return;//路径喷涂
if (pathSpray(emitter, frontCmdId, frontCmdName, volume, pathList, movingSpeed))
return;//路径喷涂
if (i + 1 != times) { //如果不是最后一次执行完毕后回到玻片原点 if (i + 1 != times) { //如果不是最后一次执行完毕后回到玻片原点
log.info("123"); log.info("123");
latch = new CountDownLatch(2); latch = new CountDownLatch(2);
@ -255,7 +262,8 @@ public class MatrixSprayStart implements CommandHandler {
spacing, spacing,
PathGenerator.MoveMode.VERTICAL_ZIGZAG_LEFT_RIGHT PathGenerator.MoveMode.VERTICAL_ZIGZAG_LEFT_RIGHT
); );
if (pathSpray(emitter, frontCmdId, frontCmdName, volume, pathList, movingSpeed)) return;//路径喷涂
if (pathSpray(emitter, frontCmdId, frontCmdName, volume, pathList, movingSpeed))
return;//路径喷涂
if (i + 1 != times) { //如果不是最后一次执行完毕后回到玻片原点 if (i + 1 != times) { //如果不是最后一次执行完毕后回到玻片原点
log.info("123"); log.info("123");
latch = new CountDownLatch(2); latch = new CountDownLatch(2);
@ -288,13 +296,15 @@ public class MatrixSprayStart implements CommandHandler {
spacing, spacing,
PathGenerator.MoveMode.VERTICAL_ZIGZAG_LEFT_RIGHT PathGenerator.MoveMode.VERTICAL_ZIGZAG_LEFT_RIGHT
); );
if (pathSpray(emitter, frontCmdId, frontCmdName, volume, pathList, movingSpeed)) return;//路径喷涂
if (pathSpray(emitter, frontCmdId, frontCmdName, volume, pathList, movingSpeed))
return;//路径喷涂
pathList = PathGenerator.generatePathPoints( pathList = PathGenerator.generatePathPoints(
leftReal, rightReal, topReal, bottomReal, leftReal, rightReal, topReal, bottomReal,
spacing, spacing,
PathGenerator.MoveMode.HORIZONTAL_ZIGZAG_TOP_DOWN PathGenerator.MoveMode.HORIZONTAL_ZIGZAG_TOP_DOWN
); );
if (pathSpray(emitter, frontCmdId, frontCmdName, volume, pathList, movingSpeed)) return;//路径喷涂
if (pathSpray(emitter, frontCmdId, frontCmdName, volume, pathList, movingSpeed))
return;//路径喷涂
if (i + 1 != times) { //如果不是最后一次执行完毕后回到玻片原点 if (i + 1 != times) { //如果不是最后一次执行完毕后回到玻片原点
log.info("123"); log.info("123");
latch = new CountDownLatch(2); latch = new CountDownLatch(2);
@ -340,8 +350,15 @@ public class MatrixSprayStart implements CommandHandler {
//12.结束日志 //12.结束日志
//TODO写日志 //TODO写日志
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.SEND, "指令执行完毕"), MediaType.APPLICATION_JSON); emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.SEND, "指令执行完毕"), MediaType.APPLICATION_JSON);
} catch (Exception e) {
Thread.currentThread().interrupt();
log.info("喷涂线程已停止");
System.out.println("任务中断");
} finally {
emitter.complete(); emitter.complete();
} }
});
}
private boolean motorSpeedSet(ResponseBodyEmitter emitter, Double movingSpeed, String frontCmdId, String frontCmdName) throws IOException { private boolean motorSpeedSet(ResponseBodyEmitter emitter, Double movingSpeed, String frontCmdId, String frontCmdName) throws IOException {

1
src/main/java/com/qyft/ms/app/handler/impl/MatrixSprayStop.java

@ -49,6 +49,7 @@ public class MatrixSprayStop implements CommandHandler {
String frontCmdId = cmdForm.getCmdId(); String frontCmdId = cmdForm.getCmdId();
String frontCmdName = cmdForm.getCmdName(); String frontCmdName = cmdForm.getCmdName();
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令"), MediaType.APPLICATION_JSON);//向前端发送接收到指令 emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令"), MediaType.APPLICATION_JSON);//向前端发送接收到指令
log.info("申请中断喷涂线程:{}", matrixSprayState.cancelTask());
//1.轴停止移动 //1.轴停止移动
CMDToDevice motorXStopCMDToDevice = DeviceCommandGenerator.motor_x_stop(); //x轴停止移动指令 CMDToDevice motorXStopCMDToDevice = DeviceCommandGenerator.motor_x_stop(); //x轴停止移动指令
CommandFuture motorXStopCMDToDeviceFuture = new CommandFuture(); CommandFuture motorXStopCMDToDeviceFuture = new CommandFuture();

Loading…
Cancel
Save