worker设计模式:
worker能够异步的执行一些任务。为实现这个目的,有两种方式:
1. 建立一个抽象的AbstractWorker,不同逻辑的worker对其进行不同的实现;
2. 对worker新增一个TaskProcessor不同的任务传入不同的processor即可。
主要介绍第二种方式:
(1)进入入口类后默认先执行fetchWorkerTasks、再执行processWorkerTask方法,如果执行失败processWorkerTask方法会调用handerTask方法计算下一次执行的时间
public class DoMonitorAlarmWebWT extends AbstractBaseSingleWorkerTask<MonitorConfigAlarmWebdto> {
@Autowired
private MonitorConfigAlarmWebService monitorService;
private static final Logger logger = Logger.getLogger(DoMonitorAlarmWebWT.class);
@Override
protected List<MonitorConfigAlarmWebdto> fetchWorkerTasks(String ownSign, int queueNum,
List<TaskItemDefine> queueList, int fetchNum) {
List<MonitorConfigAlarmWebdto> taskList = null;
try {
logger.info(LoggerConstans.INFO_ALARM_WEB_OBTAIN_START);
MonitorConfigAlarmWebdto record = new MonitorConfigAlarmWebdto();
record.setQueueNum(queueNum);
record.setFetchNum(fetchNum);
String queuelistStr = StringUtil.getCondition(queueList).toString();
if (StringUtils.isBlank(queuelistStr))
return null;
record.setCondition(queuelistStr);
taskList = this.monitorService.fetchWorker();
logger.info(LoggerConstans.INFO_ALARM_WEB_OBTAIN_SUCCESS);
} catch (Exception e) {
logger.error(LoggerConstans.ERROR_ALARM_WEB_OBTAIN_FAIL, e);
}
return taskList;
}
@Override
protected boolean processWorkerTask(MonitorConfigAlarmWebdto task) {
try {
logger.info(LoggerConstans.INFO_ALARM_WEB_EXECUTE_START);
try {
this.monitorService.processWorker(task);
this.monitorService.handerTask(task);
} catch (Exception e) {
logger.error(LoggerConstans.ERROR_ALARM_WEB_EXECUTE_FAIL, e);
}
logger.info(LoggerConstans.INFO_ALARM_WEB_EXECUTE_SUCCESS);
} catch (Exception e) {
logger.error(LoggerConstans.ERROR_ALARM_WEB_EXECUTE_FAIL, e);
}
return true;
}
(2)service层 入口类会调用service层处理业务逻辑。处理业务表使用业务service,处理worker使用worker的service
public interface MonitorConfigAlarmService {
public List<MonitorConfigAlarm> fetchWorker(MonitorConfigAlarm item) throws Exception;
public void processWorker(MonitorConfigAlarm item) throws Exception;
public void handerTask(MonitorConfigAlarm item) throws Exception;
}
(3)manager层 service层调用manager层进行数据保存,同时处理事务问题。service只是简单的调用方法,manager实现业务逻辑。
(4)mapper层 持久化数据层 mybatis的mapper.java 或mapper.xml.