最近工作之余对之前《统一任务分发调度执行框架》 中的一些通过if else代码进行优化,意在通过策略模式替代原有的if else判断逻辑,以方便后续能进行更好的扩展。
(一)原始代码
import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.alibaba.cloud.commons.lang.StringUtils;
import com.alibaba.fastjson.JSON;
import com.xxx.domain.AjaxResult;
import com.xxx.domain.AcsTask;
import com.xxx.rpc.AcsClientNew;
import com.xxx.service.IAcsTaskService;
import com.dtflys.forest.backend.httpclient.response.HttpclientForestResponse;
/**
*
* @ClassName: AcsTaskManager
* @Description: ACS任务管理器,统一管理发往ACS的任务(包括直到ACS的任务和需要到达CPE的任务)
* @Author: liulianglin
* @DateTime 2022年1月20日 下午5:02:29
*/
@Component
public class AcsTaskManager {
private static final Logger log = LoggerFactory.getLogger(AcsTaskManager.class);
@Autowired
private AcsClientNew acsClientNew;
@Autowired
private IAcsTaskService acsTaskService;
@Autowired
private AcsTaskCache acsTaskCache;
@Autowired
AcsTaskResultParser acsTaskResultParser;
public AcsTaskManager() {
log.info("AcsTaskManager 启动。。。。");
}
/**
*
* @Description: 任务提交接口: 提供给业务层或者Controller层其他模块使用
* @Author: liuliagnlin
* @Datetime: 2022年1月20日 下午5:44:47
* @param originalTask
* @return AjaxResult
* @throws
*/
public AjaxResult submitTask(OriginalTask originalTask, ICallBack callback) {
if(!validateParam(originalTask)) {
return AjaxResult.error("[ACS任务管理器]--提交任务参数异常, 任务={" + JSON.toJSONString(originalTask) +"}");
}
/*
* ADD -->POST
* DELETE --> DELETE
* UPDATE --> PUT
* QUERY -->GET
*
* actionType:值为ADD DELETE UPDATE QUERY中的一种
*/
if(originalTask.getActionType().equals(ActionTypeEnum.ADD.getActionType())) {
return submitAddTask(originalTask, callback);
}
if(originalTask.getActionType().equals(ActionTypeEnum.QUERY.getActionType())) {
return submitQueryTask(originalTask, callback);
}
if(originalTask.getActionType().equals(ActionTypeEnum.UPDATE.getActionType())) {
return submitPutTask(originalTask, callback);
}
if(originalTask.getActionType().equals(ActionTypeEnum.DELETE.getActionType())) {
return submitDeleteTask(originalTask, callback);
}
log.error(originalTask.getObjectId() +
originalTask.getDescription() +
"任务提交失败,不支持的actionType, 原始任务={"+JSON.toJSONString(originalTask) + "}");
return AjaxResult.error(originalTask.getObjectId() +
originalTask.getDescription() +
"任务提交失败,不支持的actionType");
}
/**
*
* @Description: 对应处理POST请求
* @Author: liuliagnlin
* @Datetime: 2022年1月21日 上午11:46:54
* @return AjaxResult
* @throws
*/
private AjaxResult submitAddTask(OriginalTask originalTask, ICallBack callback) {
/*
*add类型任务可能的URL包括:
* /tasks/<task_id>/retry (走CPE, 没有请求body, objectType为TASKS)
* /devices/<device_id>/tasks?timeout=3000&connection_request=1 (走CPE,请求body为json,objectType为DEVICES_TASKS)
*
*/
if (originalTask.getObjectType().equals(ObjectTypeEnum.DEVICES_TASKS.getObjectType()) ||
originalTask.getObjectType().equals(ObjectTypeEnum.TASKS_RETRY.getObjectType())) {
try {
// 将任务持久化到Mysql中
AcsTask acsTask = storageTask(originalTask, callback);
if(null == acsTask) {
log.error("提交任务失败,acsTask为空");
return AjaxResult.error("提交任务失败, AcsTask为空");
}else {
// 此处用处:这里和taskManager添加任务那里形成一个阻塞唤醒机制,更好的进行线程控制。
// 写入后唤醒可能处于等待状态的AcsTaskDispatcher线程
synchronized (acsTaskCache.getSleepLock()) {
log.info("将一个<{}-{}>任务写入内存中的任务表中, 原始任务originalTask = {}",
originalTask.getObjectId(), originalTask.getDescription(), JSON.toJSONString(originalTask));
if (StringUtils.isNotBlank(originalTask.getTaskPriority()) &&
originalTask.getTaskPriority().equals(TaskPriorityEnum.URGENT.type()) ) {
// 1.处理紧急任务: 将任务添加为任务表头部的第一个元素
log.info("当前任务为紧急任务: 将任务添加为任务表头部的第一个元素");
acsTaskCache.addUrgentOriginalTask(acsTask);
}else {
// 2.处理普通任务: 将任务写入内存中的任务表中