Browse Source

增加步骤:摇匀和刺孔

master
sige 2 years ago
parent
commit
d36fda5b9f
  1. 1
      src/main/java/com/dreamworks/boditech/controller/DeviceController.java
  2. 7
      src/main/java/com/dreamworks/boditech/controller/TestController.java
  3. 3
      src/main/java/com/dreamworks/boditech/driver/Command.java
  4. 15
      src/main/java/com/dreamworks/boditech/driver/ConsumableBufferTube.java
  5. 9
      src/main/java/com/dreamworks/boditech/driver/ConsumablePipetteTip.java
  6. 116
      src/main/java/com/dreamworks/boditech/driver/Device.java
  7. 29
      src/main/java/com/dreamworks/boditech/driver/actuator/ActArmXY.java
  8. 13
      src/main/java/com/dreamworks/boditech/driver/actuator/ActMotor.java
  9. 7
      src/main/java/com/dreamworks/boditech/driver/actuator/ActuatorModule.java
  10. 17
      src/main/java/com/dreamworks/boditech/driver/consumable/CsmBufferTubeA.java
  11. 17
      src/main/java/com/dreamworks/boditech/driver/consumable/CsmBufferTubeB.java
  12. 22
      src/main/java/com/dreamworks/boditech/driver/consumable/CsmLargeBufferTube.java
  13. 15
      src/main/java/com/dreamworks/boditech/driver/consumable/CsmPipetteTip.java
  14. 9
      src/main/java/com/dreamworks/boditech/driver/task/TaskTest.java
  15. 7
      src/main/java/com/dreamworks/boditech/driver/task/step/Step.java
  16. 4
      src/main/java/com/dreamworks/boditech/driver/task/step/StepBase.java
  17. 46
      src/main/java/com/dreamworks/boditech/driver/task/step/StepManager.java
  18. 54
      src/main/java/com/dreamworks/boditech/driver/task/step/StepPuncture.java
  19. 50
      src/main/java/com/dreamworks/boditech/driver/task/step/StepShake.java
  20. 11
      src/main/java/com/dreamworks/boditech/service/DeviceService.java

1
src/main/java/com/dreamworks/boditech/controller/DeviceController.java

@ -1,5 +1,6 @@
package com.dreamworks.boditech.controller;
import com.dreamworks.boditech.controller.entity.ApiResponse;
import com.dreamworks.boditech.driver.task.step.StepManager;
import com.dreamworks.boditech.service.DeviceService;
import com.dreamworks.boditech.utils.MyWebsocketServer;
import jakarta.annotation.Resource;

7
src/main/java/com/dreamworks/boditech/controller/TestController.java

@ -1,6 +1,7 @@
package com.dreamworks.boditech.controller;
import com.dreamworks.boditech.controller.entity.ApiResponse;
import com.dreamworks.boditech.driver.task.TaskBatchTubePrepare;
import com.dreamworks.boditech.driver.task.TaskTest;
import com.dreamworks.boditech.entity.request.test.AppendParam;
import com.dreamworks.boditech.service.DeviceService;
import jakarta.annotation.Resource;
@ -16,8 +17,10 @@ public class TestController extends BaseController {
@ResponseBody
@PostMapping("/api/test/append")
public ApiResponse append( @RequestBody AppendParam appendParam) {
TaskBatchTubePrepare task = new TaskBatchTubePrepare();
task.setTests(appendParam.tests);
// TaskBatchTubePrepare task = new TaskBatchTubePrepare();
// task.setTests(appendParam.tests);
TaskTest task = new TaskTest();
this.deviceService.taskAppend(task);
return this.success();
}

3
src/main/java/com/dreamworks/boditech/driver/Command.java

@ -9,8 +9,10 @@ public class Command {
public static final Integer CMD_MODULE_READ_IO = 0x0107;
public static final Integer CMD_MODULE_READ_RAW = 0x0113;
public static final Integer CMD_MODULE_START = 0x0115;
public static final Integer CMD_MOTOR_EASY_ROTATE = 0x0211;
public static final Integer CMD_MOTOR_EASY_MOVE_BY = 0x0212;
public static final Integer CMD_MOTOR_EASY_MOVE_TO = 0x0213;
public static final Integer CMD_XYMOTOR_MOVE_TO = 0x0303;
// command meta data
public static final Map<Integer,CommandMeta> cmdMetaMap = new HashMap<Integer,CommandMeta>();
@ -25,6 +27,7 @@ public class Command {
Command.cmdMetaMap.put(CMD_MODULE_READ_RAW, new CommandMeta("module_read_raw"));
Command.cmdMetaMap.put(CMD_MOTOR_EASY_MOVE_TO, new CommandMeta("motor_easy_move_to"));
Command.cmdMetaMap.put(CMD_MOTOR_EASY_MOVE_BY, new CommandMeta("motor_easy_move_by"));
Command.cmdMetaMap.put(CMD_MOTOR_EASY_ROTATE, new CommandMeta("motor_easy_rotate"));
}
return cmdMetaMap.get(cmd);

15
src/main/java/com/dreamworks/boditech/driver/ConsumableBufferTube.java

@ -1,15 +0,0 @@
package com.dreamworks.boditech.driver;
public class ConsumableBufferTube {
// project id
public Integer projectId;
// project name
public Integer projectName;
// batch number
public Integer type;
// location x
public Integer locationX;
// location y
public Integer locationY;
// location z
public Integer LocationZ;
}

9
src/main/java/com/dreamworks/boditech/driver/ConsumablePipetteTip.java

@ -1,9 +0,0 @@
package com.dreamworks.boditech.driver;
public class ConsumablePipetteTip {
// location x
public Integer locationX;
// location y
public Integer locationY;
// location z
public Integer LocationZ;
}

116
src/main/java/com/dreamworks/boditech/driver/Device.java

@ -1,7 +1,10 @@
package com.dreamworks.boditech.driver;
import com.dreamworks.boditech.driver.actuator.*;
import com.dreamworks.boditech.driver.connection.ComSerialPort;
import com.dreamworks.boditech.mapper.DeviceLogMapper;
import com.dreamworks.boditech.driver.consumable.CsmBufferTubeA;
import com.dreamworks.boditech.driver.consumable.CsmBufferTubeB;
import com.dreamworks.boditech.driver.consumable.CsmLargeBufferTube;
import com.dreamworks.boditech.driver.consumable.CsmPipetteTip;
import com.dreamworks.boditech.utils.MyByteBuffer;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
@ -11,7 +14,9 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component
public class Device {
@ -23,11 +28,16 @@ public class Device {
@Resource
private ComSerialPort serialPort;
@Resource
private DeviceLogMapper deviceLogMapper;
// actuators
private final Map<Integer, Actuator> actuators = new HashMap<Integer, Actuator>();
// pipette tips
private final List<CsmPipetteTip> pipetteTips = new ArrayList<CsmPipetteTip>();
// buffer tube larges
private final List<CsmLargeBufferTube> largeBufferTubes = new ArrayList<CsmLargeBufferTube>();
// buffer tube A
private final List<CsmBufferTubeA> bufferTubeAList = new ArrayList<CsmBufferTubeA>();
// buffer tube B
private final List<CsmBufferTubeB> bufferTubeBList = new ArrayList<CsmBufferTubeB>();
// message index
private short messageIndex = 0;
@ -38,6 +48,13 @@ public class Device {
this.appendActuator(new ActMotor(ActuatorModule.TEST_TUBE_RACK_MOVE_MOTOR, this));
this.appendActuator(new ActMotor(ActuatorModule.TEST_TUBE_RACK_EXIT_MOTOR, this));
this.appendActuator(new ActCodeScanner(ActuatorModule.TEST_TUBE_RACK_SCANNER, this));
this.appendActuator(new ActMotor(ActuatorModule.TEST_TUBE_SHAKING_MOVE_MOTOR, this));
this.appendActuator(new ActMotor(ActuatorModule.TEST_TUBE_SHAKING_CAP_CLIP_MOTOR, this));
this.appendActuator(new ActMotor(ActuatorModule.TEST_TUBE_SHAKING_SHAKE_MOTOR, this));
this.appendActuator(new ActMotor(ActuatorModule.TEST_TUBE_SHAKING_ROTATE_MOTOR, this));
this.appendActuator(new ActMotor(ActuatorModule.TEST_TUBE_SHAKING_CLIP_MOTOR, this));
this.appendActuator(new ActArmXY(ActuatorModule.ARM_XY, this));
this.appendActuator(new ActMotor(ActuatorModule.ARM_Z_MOTOR, this));
}
// append actuator
@ -50,9 +67,94 @@ public class Device {
return this.actuators.get(mid);
}
// get debug mode
public Boolean getIsDebug() {
return this.debug;
// append buffer tube A
public void appendBufferTubeA( Integer areaIndex, Integer amount ) {
for (int i = 0; i<amount; i++ ) {
CsmBufferTubeA tube = new CsmBufferTubeA();
tube.areaIndex = areaIndex;
tube.position = i;
this.bufferTubeAList.add(tube);
}
}
// get buffer tube A
public CsmBufferTubeA getBufferTubeA( String projectName ) {
for (CsmBufferTubeA tube : this.bufferTubeAList) {
if (!tube.projectName.equals(projectName)) {
continue;
}
this.bufferTubeAList.remove(tube);
return tube;
}
throw new RuntimeException("no buffer tube A for project " + projectName);
}
// append buffer tube B
public void appendBufferTubeB( Integer areaIndex, Integer amount ) {
for (int i = 0; i<amount; i++ ) {
CsmBufferTubeB tube = new CsmBufferTubeB();
tube.areaIndex = areaIndex;
tube.position = i;
this.bufferTubeBList.add(tube);
}
}
// get buffer tube B
public CsmBufferTubeB getBufferTubeB( String projectName ) {
for (CsmBufferTubeB tube : this.bufferTubeBList) {
if (!tube.projectName.equals(projectName)) {
continue;
}
this.bufferTubeBList.remove(tube);
return tube;
}
throw new RuntimeException("no buffer tube B for project " + projectName);
}
// append pipette tip
public void appendPipetteTip( Integer areaIndex, Integer amount ) {
for (int i = 0; i<amount; i++ ) {
CsmPipetteTip tip = new CsmPipetteTip();
tip.areaIndex = areaIndex;
tip.position = i;
this.pipetteTips.add(tip);
}
}
// get pipette tip
public CsmPipetteTip getPipeTip() {
if ( this.pipetteTips.isEmpty() ) {
throw new RuntimeException("no pipette tip");
}
CsmPipetteTip tip = this.pipetteTips.remove(0);
return tip;
}
// append large buffer tube
public void appendLargeBufferTube( Integer position ) {
CsmLargeBufferTube tube = new CsmLargeBufferTube();
tube.position = position;
this.largeBufferTubes.removeIf(tmp -> tmp.position.equals(position));
this.largeBufferTubes.add(tube);
}
// get large buffer tube
public CsmLargeBufferTube getLargeBufferTube( String projectName ) {
CsmLargeBufferTube tube = null;
for ( CsmLargeBufferTube tmp : this.largeBufferTubes ) {
if ( !tmp.projectName.equals(projectName) ) {
continue ;
}
if ( tmp.isEmpty() ) {
continue;
}
tube = tmp;
break;
}
if ( null == tube ) {
throw new RuntimeException("no large buffer tube");
}
return tube;
}
// call device command and wait for response

29
src/main/java/com/dreamworks/boditech/driver/actuator/ActArmXY.java

@ -0,0 +1,29 @@
package com.dreamworks.boditech.driver.actuator;
import com.dreamworks.boditech.driver.Command;
import com.dreamworks.boditech.driver.Device;
public class ActArmXY extends ActuatorBase {
// constructor
public ActArmXY(Integer mid, Device device) {
super(mid, device);
}
/**
* move to given position
* @param x x position
* @param y y position
*/
public void moveTo(int x, int y) {
this.moveTo(x, y, 0);
}
/**
* move to given position
* @param x x position
* @param y y position
* @param velocity 0: default velocity, otherwise: rpm per minute for motor
*/
public void moveTo(int x, int y, int velocity) {
this.call(Command.CMD_XYMOTOR_MOVE_TO, x, y, velocity);
this.waitForFinish();
}
}

13
src/main/java/com/dreamworks/boditech/driver/actuator/ActMotor.java

@ -1,8 +1,12 @@
package com.dreamworks.boditech.driver.actuator;
import com.dreamworks.boditech.driver.Command;
import com.dreamworks.boditech.driver.Device;
public class ActMotor extends ActuatorBase {
// rotate direction
public static final int ROTATE_DIRECTION_CLOCKWISE = 1;
// rotate direction
public static final int ROTATE_DIRECTION_COUNTER_CLOCKWISE = -1;
// constructor
public ActMotor(Integer mid, Device device) {
super(mid, device);
@ -14,8 +18,15 @@ public class ActMotor extends ActuatorBase {
this.waitForFinish();
}
// move by given distance
public void moveBy(int distance) {
this.call(Command.CMD_MOTOR_EASY_MOVE_BY, distance);
this.waitForFinish();
}
// rotate
public void rotate( int direction ) {
this.call(Command.CMD_MOTOR_EASY_ROTATE, direction);
this.waitForFinish();
}
}

7
src/main/java/com/dreamworks/boditech/driver/actuator/ActuatorModule.java

@ -1,5 +1,12 @@
package com.dreamworks.boditech.driver.actuator;
public class ActuatorModule {
public static Integer ARM_XY = 11;
public static Integer ARM_Z_MOTOR = 81;
public static Integer TEST_TUBE_SHAKING_MOVE_MOTOR = 31;
public static Integer TEST_TUBE_SHAKING_ROTATE_MOTOR = 32;
public static Integer TEST_TUBE_SHAKING_CLIP_MOTOR = 33;
public static Integer TEST_TUBE_SHAKING_CAP_CLIP_MOTOR = 34;
public static Integer TEST_TUBE_SHAKING_SHAKE_MOTOR = 35;
public static Integer TEST_TUBE_RACK_MOVEMENT = 60;
public static Integer TEST_TUBE_RACK_FEED_MOTOR = 61;
public static Integer TEST_TUBE_RACK_MOVE_MOTOR = 62;

17
src/main/java/com/dreamworks/boditech/driver/consumable/CsmBufferTubeA.java

@ -0,0 +1,17 @@
package com.dreamworks.boditech.driver.consumable;
public class CsmBufferTubeA {
// area index
public Integer areaIndex;
// position
public Integer position;
// project name
public String projectName = "demo";
public Integer getLocationX() {
return 1000;
}
public Integer getLocationY() {
return 1000;
}
}

17
src/main/java/com/dreamworks/boditech/driver/consumable/CsmBufferTubeB.java

@ -0,0 +1,17 @@
package com.dreamworks.boditech.driver.consumable;
public class CsmBufferTubeB {
// area index
public Integer areaIndex;
// position
public Integer position;
// project name
public String projectName;
public Integer getLocationX() {
return 0;
}
public Integer getLocationY() {
return 0;
}
}

22
src/main/java/com/dreamworks/boditech/driver/consumable/CsmLargeBufferTube.java

@ -0,0 +1,22 @@
package com.dreamworks.boditech.driver.consumable;
public class CsmLargeBufferTube {
// position
public Integer position;
// project name
public String projectName;
// get location x
public Integer getLocationX() {
return 0;
}
// get location y
public Integer getLocationY() {
return 0;
}
// get if the tube is empty
public boolean isEmpty() {
return false;
}
}

15
src/main/java/com/dreamworks/boditech/driver/consumable/CsmPipetteTip.java

@ -0,0 +1,15 @@
package com.dreamworks.boditech.driver.consumable;
public class CsmPipetteTip {
// area index
public Integer areaIndex;
// position
public Integer position;
public Integer getLocationX() {
return 500;
}
public Integer getLocationY() {
return 500;
}
}

9
src/main/java/com/dreamworks/boditech/driver/task/TaskTest.java

@ -2,6 +2,8 @@ package com.dreamworks.boditech.driver.task;
import com.dreamworks.boditech.driver.Task;
import com.dreamworks.boditech.driver.TaskExecutor;
import com.dreamworks.boditech.driver.TestStep;
import com.dreamworks.boditech.driver.task.step.Step;
import com.dreamworks.boditech.driver.task.step.StepManager;
import java.util.List;
public class TaskTest implements Task {
@ -14,7 +16,7 @@ public class TaskTest implements Task {
// test tube
public String testTubeType;
// project
public String projectName;
public String projectName = "demo";
// sample type
public String bloodType;
// sample process
@ -28,6 +30,9 @@ public class TaskTest implements Task {
@Override
public void execute(TaskExecutor executor) {
List<Step> steps = StepManager.buildSteps("[{\"action\":\"puncture\",\"tubeType\":\"A\"}]");
for ( Step step : steps ) {
step.execute(executor, this);
}
}
}

7
src/main/java/com/dreamworks/boditech/driver/task/step/Step.java

@ -0,0 +1,7 @@
package com.dreamworks.boditech.driver.task.step;
import com.dreamworks.boditech.driver.Task;
import com.dreamworks.boditech.driver.TaskExecutor;
public interface Step {
// execute step
public void execute(TaskExecutor executor, Task task );
}

4
src/main/java/com/dreamworks/boditech/driver/task/step/StepBase.java

@ -0,0 +1,4 @@
package com.dreamworks.boditech.driver.task.step;
abstract public class StepBase implements Step {
}

46
src/main/java/com/dreamworks/boditech/driver/task/step/StepManager.java

@ -0,0 +1,46 @@
package com.dreamworks.boditech.driver.task.step;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class StepManager {
// step name to step class
private static final Map<String,Class<? extends Step>> stepMap = new HashMap<>();
// load step map
private static void loadStepMap() {
if ( !StepManager.stepMap.isEmpty() ) {
return ;
}
StepManager.stepMap.put("shake", StepShake.class);
StepManager.stepMap.put("puncture", StepPuncture.class);
}
// build step by given name
public static List<Step> buildSteps(String json) {
StepManager.loadStepMap();
ObjectMapper jsonMapper = new ObjectMapper();
JsonNode stepJsonTree = null;
try {
stepJsonTree = jsonMapper.readTree(json);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
List<Step> steps = new ArrayList<>();
for ( JsonNode stepNode : stepJsonTree ) {
String name = stepNode.get("action").asText();
Class<? extends Step> stepClass = StepManager.stepMap.get(name);
if ( stepClass == null ) {
throw new RuntimeException("step class not found: " + name);
}
Step step = jsonMapper.convertValue(stepNode, stepClass);
steps.add(step);
}
return steps;
}
}

54
src/main/java/com/dreamworks/boditech/driver/task/step/StepPuncture.java

@ -0,0 +1,54 @@
package com.dreamworks.boditech.driver.task.step;
import com.dreamworks.boditech.driver.Device;
import com.dreamworks.boditech.driver.Task;
import com.dreamworks.boditech.driver.TaskExecutor;
import com.dreamworks.boditech.driver.actuator.ActArmXY;
import com.dreamworks.boditech.driver.actuator.ActMotor;
import com.dreamworks.boditech.driver.actuator.ActuatorModule;
import com.dreamworks.boditech.driver.consumable.CsmBufferTubeA;
import com.dreamworks.boditech.driver.consumable.CsmBufferTubeB;
import com.dreamworks.boditech.driver.consumable.CsmPipetteTip;
import com.dreamworks.boditech.driver.task.TaskTest;
import com.fasterxml.jackson.annotation.JsonProperty;
public class StepPuncture extends StepBase {
@JsonProperty("action")
public String action;
@JsonProperty("tubeType")
public String tubeType;
@Override
public void execute(TaskExecutor executor, Task task) {
Device device = executor.getDevice();
ActArmXY armXY = (ActArmXY)device.getActuator(ActuatorModule.ARM_XY);
ActMotor armZMotor = (ActMotor)device.getActuator(ActuatorModule.ARM_Z_MOTOR);
TaskTest taskTest = (TaskTest)task;
// 01. 移动到TIP区域
CsmPipetteTip tip = device.getPipeTip();
armXY.moveTo(tip.getLocationX(), tip.getLocationY());
// 02. 下降到TIP区域
armZMotor.moveTo(1000);
// 03. 上升到准备区域
armZMotor.moveTo(0);
// 04. 移动到穿刺区域
if ( "A".equals(this.tubeType) ) {
CsmBufferTubeA tube = device.getBufferTubeA(taskTest.projectName);
armXY.moveTo(tube.getLocationX(), tube.getLocationY());
} else if ( "B".equals(this.tubeType) ) {
CsmBufferTubeB tube = device.getBufferTubeB(taskTest.projectName);
armXY.moveTo(tube.getLocationX(), tube.getLocationY());
} else {
throw new RuntimeException("unknown tube type " + this.tubeType);
}
// 05. 下降到穿刺区域
armZMotor.moveTo(1000);
// 06. 上升到准备区域
armZMotor.moveTo(0);
}
}

50
src/main/java/com/dreamworks/boditech/driver/task/step/StepShake.java

@ -0,0 +1,50 @@
package com.dreamworks.boditech.driver.task.step;
import com.dreamworks.boditech.driver.Device;
import com.dreamworks.boditech.driver.Task;
import com.dreamworks.boditech.driver.TaskExecutor;
import com.dreamworks.boditech.driver.actuator.ActMotor;
import com.dreamworks.boditech.driver.actuator.ActuatorModule;
import com.fasterxml.jackson.annotation.JsonProperty;
public class StepShake extends StepBase {
@JsonProperty("action")
public String action;
@Override
public void execute(TaskExecutor executor, Task task) {
Device device = executor.getDevice();
ActMotor testTubeCapClipMotor = (ActMotor)device.getActuator(ActuatorModule.TEST_TUBE_SHAKING_CAP_CLIP_MOTOR);
ActMotor testTubeShakeMotor = (ActMotor)device.getActuator(ActuatorModule.TEST_TUBE_SHAKING_SHAKE_MOTOR);
ActMotor testTubeMoveMotor = (ActMotor)device.getActuator(ActuatorModule.TEST_TUBE_SHAKING_MOVE_MOTOR);
ActMotor testTubeClipMotor = (ActMotor)device.getActuator(ActuatorModule.TEST_TUBE_SHAKING_CLIP_MOTOR);
// 01. 试管帽夹打开
testTubeCapClipMotor.moveTo(500);
// 02. 下降到试管位置
testTubeMoveMotor.moveTo(150);
// 03. 试管帽夹关闭
testTubeCapClipMotor.moveTo(900);
// 04. 上升到摇晃位置
testTubeMoveMotor.moveTo(1300);
// 05. 摇晃
testTubeShakeMotor.rotate(ActMotor.ROTATE_DIRECTION_CLOCKWISE);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
testTubeShakeMotor.stop();
// 06. 下降到试管位置
testTubeMoveMotor.moveTo(150);
// 07. 试管夹夹紧
testTubeClipMotor.rotate(ActMotor.ROTATE_DIRECTION_CLOCKWISE);
// 08. 上升到原始位置
testTubeMoveMotor.moveTo(1300);
}
}

11
src/main/java/com/dreamworks/boditech/service/DeviceService.java

@ -1,5 +1,7 @@
package com.dreamworks.boditech.service;
import com.dreamworks.boditech.driver.*;
import com.dreamworks.boditech.driver.consumable.CsmLargeBufferTube;
import com.dreamworks.boditech.driver.consumable.CsmPipetteTip;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
@ -12,9 +14,9 @@ public class DeviceService {
public Device device;
// pipette tips
public List<ConsumablePipetteTip> pipetteTips;
public List<CsmPipetteTip> pipetteTips;
// buffer tubes
public List<ConsumableBufferTube> bufferTubes;
public List<CsmLargeBufferTube> bufferTubes;
// test cards
public List<ConsumableTestCard> testCards;
// tasks
@ -26,6 +28,11 @@ public class DeviceService {
// start
public void start() {
this.device.appendPipetteTip(0, 10);
this.device.appendPipetteTip(1, 10);
this.device.appendPipetteTip(2, 10);
this.device.appendBufferTubeA(0, 10);
this.taskExecutor = new TaskExecutor(this.tasks, this.device);
this.taskExecutorThread = new Thread(this.taskExecutor);
this.taskExecutorThread.setName("task-executor");

Loading…
Cancel
Save