Worker学习笔记

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.

猜你喜欢

转载自blog.csdn.net/weixin_41722016/article/details/81183893