• 使用ServiceLoader辅助责任链模式


     在项目中,常常会遇到这么一种场景,即对一批/一种/一堆数据,进行链式的处理。举个栗子,拿到一个task后,需要对这个task进行校验处理、状态变更处理、计算并回填数据处理等等各种处理,这种情况下,最适合的编码方式就是使用责任链了:

    定义一个taskprocessor接口:

    public interface TaskProcessor {
    
        boolean process(Task task, TaskConfigDTO config);
    
    }
    

    然后,再定义诸多的实现类,来进行处理,可以使代码更加优雅和便于扩展。下一点要考虑的就是在代码中,怎么加载/注入这些实现类呢 ?

    (1)使用spring配置,对List<TaskProcessor> processors这个field字段使用XML注入list。

    (2)使用java.util.ServiceLoader

    在第二种方式下,由于不依赖于任何第三方,更加干净,且个人认为也更加优雅一点点。代码如下:

    @Service
    public class RetryTaskProcessorManager {
    
        private ServiceLoader<TaskProcessor> processors = ServiceLoader.load(TaskProcessor.class);
    
        public void process(Task task, TaskConfigDTO config) {
            for (TaskProcessor processor : processors) {
                boolean result = processor.process(task, config);
                if (!result) {
                    break;
                }
            }
        }
    
    }
    

    同时,需要在resources/META-INF/services/接口全路径名的文件中,输入接口实现类的所有全路径名。如此,也能保证processor的处理顺序。

    com.dianping.vc.retry.service.domain.impl.processor.task.TaskStatusProcessor
    com.dianping.vc.retry.service.domain.impl.processor.task.MaxRetryCountProcessor
    com.dianping.vc.retry.service.domain.impl.processor.task.NextExecuteTimeProcessor
    
  • 相关阅读:
    Hdu 3564 Another LIS 线段树+LIS
    利用ESLINT进行js 语法检查,以及局部安装时遇到的一些坑
    操作系统杂谈
    算法杂谈
    前端杂谈
    操作系统复习
    vue之——从彩笔的进步之路
    一丢丢学习之webpack4 + Vue单文件组件的应用
    计蒜客 2017复赛 百度地图导航
    electron打包之真的恶心
  • 原文地址:https://www.cnblogs.com/dosmile/p/6560421.html
Copyright © 2020-2023  润新知