浅读elastic-job总结所用设计模式
来源:互联网 发布:怎么知快怀孕了 编辑:程序博客网 时间:2024/05/21 17:57
最近在研读开源分布式定时任务框架elastic-job源码,基本清晰该框架逻辑架构和设计理念,现总结研读过程中使用到的设计模式。
1. 单例模式
设计模式中最基本也是最常用的一种,在es-job中使用如下:
@NoArgsConstructor(access = AccessLevel.PRIVATE)public final class JobRegistry { private static volatile JobRegistry instance; private Map<String, JobScheduleController> schedulerMap = new ConcurrentHashMap<>(); /** * 获取作业注册表实例. * * @return 作业注册表实例 */ public static JobRegistry getInstance() { if (null == instance) { synchronized (JobRegistry.class) { if (null == instance) { instance = new JobRegistry(); } } } return instance; }该单例模式采用双重检查锁进行实现,需要注意静态实例用volatile关键字修饰是很有必要的,如果没有volatile则该单例模式可能出现多例的情况,原因如下:
volatile(java5):可以保证多线程下的可见性;
读volatile:每当子线程某一语句要用到volatile变量时,都会从主线程重新拷贝一份,这样就保证子线程的会跟主线程的一致。
写volatile: 每当子线程某一语句要写volatile变量时,都会在读完后同步到主线程去,这样就保证主线程的变量及时更新。
2. 工厂模式和模板模式
源码中用到的工厂模式是与模板模式一起使用的,
public static final class LiteJob implements Job { @Setter private ElasticJob elasticJob; @Setter private JobFacade jobFacade; @Override public void execute(final JobExecutionContext context) throws JobExecutionException { JobExecutorFactory.getJobExecutor(elasticJob, jobFacade).execute(); } }
public final class JobExecutorFactory { /** * 获取作业执行器. * * @param elasticJob 分布式弹性作业 * @param jobFacade 作业内部服务门面服务 * @return 作业执行器 */ @SuppressWarnings("unchecked") public static AbstractElasticJobExecutor getJobExecutor(final ElasticJob elasticJob, final JobFacade jobFacade) { if (null == elasticJob) { return new ScriptJobExecutor(jobFacade); } if (elasticJob instanceof SimpleJob) { return new SimpleJobExecutor((SimpleJob) elasticJob, jobFacade); } if (elasticJob instanceof DataflowJob) { return new DataflowJobExecutor((DataflowJob) elasticJob, jobFacade); } throw new JobConfigurationException("Cannot support job type '%s'", elasticJob.getClass().getCanonicalName()); }}
此处使用的是简单工厂模式,通过不同参数生成不同AbstractElasticJobExecutor 实例对象;
public abstract class AbstractElasticJobExecutor { ....... /** * 执行作业. */ public final void execute() {process(.....);} protected abstract void process(ShardingContext shardingContext);}
此处使用模板模式,使父类算法的具体实现延迟到子类,使子类不必改变一个算法的结构即可重定义该算法的步骤。
3. 策略模式
策略模式是比较常用的一种设计模式,其设计理念是:定义一系列算法,将它们一个个封装起来,并且使他们之间可以相互替换。
在es-job中的使用中是针对不同类型的任务类型设计不同的业务逻辑,其源码如下:
public interface JobTypeConfiguration { /** * 获取作业类型. * * @return 作业类型 */ JobType getJobType(); /** * 获取作业实现类名称. * * @return 作业实现类名称 */ String getJobClass(); /** * 获取作业核心配置. * * @return 作业核心配置 */ JobCoreConfiguration getCoreConfig(); }
public final class SimpleJobConfiguration implements JobTypeConfiguration { private final JobCoreConfiguration coreConfig; private final JobType jobType = JobType.SIMPLE; private final String jobClass;}
public final class DataflowJobConfiguration implements JobTypeConfiguration { private final JobCoreConfiguration coreConfig; private final JobType jobType = JobType.DATAFLOW; private final String jobClass; private final boolean streamingProcess;}
/** * 创建Lite作业配置构建器. * * @param jobConfig 作业配置 * @return Lite作业配置构建器 */ public static Builder newBuilder(final JobTypeConfiguration jobConfig) { return new Builder(jobConfig); }通过传入不同的jobConfig对象实现不同类型的任务。
待续。。。
0 0
- 浅读elastic-job总结所用设计模式
- Elastic-JOB
- Elastic-Job
- Elastic job
- elastic job (一) elastic-job-lite----SimpleJob
- 缓存所用的设计模式
- Elastic-Job之简单Job
- elastic-job 构建
- Elastic-Job中常见问题
- Elastic-Job快速使用
- Elastic-Job的主要功能
- Elastic-Job实现原理
- Elastic-Job使用限制
- Elastic-Job开发指南
- Elastic-Job开发指南
- Elastic-JOB 开发指南
- Elastic-job入门介绍
- Elastic Job 入门详解
- c++系统学习笔记
- JVM的内存区域划分(面试问题:你了解java内存模型么)
- java不常用的运算符
- hdu 1076 简单处理+递归
- javascript this的一些误解
- 浅读elastic-job总结所用设计模式
- 网络配置及文件服务
- iOS开发中 关于阿里云服务器的使用与安全策略 韩俊强的博客
- GPUview使用简介
- 如何在win8、win10中安装SQL Server 2005
- 使用 vue2+Vuex+Router 重写饿了么点餐系统和 vue 插件简析
- 为什么要写英文博客
- opencv for ios (opencv3.2)使用报错
- 使用CompletionService批处理任务(java并发编程第6章)