设计模式之模板方法模式在kafka DelayedOperation中的应用
**模板方法模式定义:**定义一个操作中的算法框架,而将一些步骤延迟到子类当中实现,使得一个子类可以不改变算法结构而重定义该算法某些具体的步骤。
DelayedOperation: DelayedOperation是Kafka延迟任务部分代码中延迟任务的抽象基类。延迟操作用来实现Kafka中的一些特殊场景,例如在ack=all的情况下生产者向broker发送数据,由于数据需要在replica中进行同步,所以broker向生产者发送response需要延迟执行,这便是一个延迟操作。
DelayedOperation代码及具体方法含义:
abstract class DelayedOperation(override val delayMs: Long,lockOpt: Option[Lock] = None) extends TimerTask with Logging {//标致操作是否完成private val completed = new AtomicBoolean(false)//辅助保证多线程情况下的线程安全private val tryCompletePending = new AtomicBoolean(false)private[server] val lock: Lock = lockOpt.getOrElse(new ReentrantLock)/** 强制进行延迟操作的算法结构(如果延迟操作没有完成,强制完成延迟操作)*/def forceComplete(): Boolean = {if (completed.compareAndSet(false, true)) {// cancel the timeout timercancel()onComplete()true} else {false}}/*** Check if the delayed operation is already completed*/def isCompleted: Boolean = completed.get()def onExpiration(): Unit/*** 执行延迟操作,由子类实现*/def onComplete(): Unit/*** 执行延迟操作,由子类实现*/def tryComplete(): Boolean/*** 多线程场景下进行延迟操作的算法结构*/private[server] def maybeTryComplete(): Boolean = {var retry = falsevar done = falsedo {if (lock.tryLock()) {try {tryCompletePending.set(false)done = tryComplete()} finally {lock.unlock()}retry = tryCompletePending.get()} else {retry = !tryCompletePending.getAndSet(true)}} while (!isCompleted && retry)done}override def run(): Unit = {if (forceComplete())onExpiration()}
}
在DelayedOperation的代码中通过maybeTryComplete方法定义了延迟操作的具体算法结构,但其中的步骤tryComplete方法并没有实现,原因在于maybeTryComplete的算法结构是不变的所有的延迟操作执行都是这个逻辑,但tryComplete的逻辑不是固定的,不同的延迟操作完成的逻辑不同。这种实现方法封装了不变的部分,扩展了(在子类)可变的部分,代码的可维护性、扩展性大大增强。
设计模式之模板方法模式在kafka DelayedOperation中的应用相关推荐
- 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之模板方法模式
· 模板方法模式在王者荣耀中的应用 · 一.简述 在王者荣耀中,有查看所有英雄功能,并且玩家在查看英雄时可以对英雄的排序做调整.具体而言,玩家可以按照默认排序.名称排序.熟练度排序.上架时间排序.荣耀 ...
- 一篇博客读懂设计模式之---模板方法模式
设计模式之模板方法模式: 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 简而言之就是:父类定义了骨架(调用哪些方法及其 ...
- 设计模式之模板方法模式详解
设计模式之模板方法模式详解 概述 在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的 ...
- Java设计模式之模板方法模式(UML类图分析+代码详解)
大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...
- php templete什么意思,PHP设计模式之模板方法模式定义与用法详解
本文实例讲述了PHP设计模式之模板方法模式定义与用法.分享给大家供大家参考,具体如下: 什么是模板方法模式 模板方法(Template Method)设计模式中使用了一个类方法templateMeth ...
- 【设计模式】模板方法模式(C#)
[设计模式]模板方法模式 1.概述 背景 在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某 ...
- 设计模式之模板方法模式(行为型)
文章目录 一.模式定义 二.模式角色 三.模式分析 四.具体例子 五.模式应用场景 一.模式定义 模板方法模式就是在一个抽象类中定义一些骨架方法,然后通过类继承的方法,将一些方法延迟到继承类里.模板方 ...
- 设计模式之模板方法模式(TemplateMethod)
设计模式之模板方法模式 模板方法模式 代码实现 模式的应用 模板方法模式 在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板.它的子类可以按需要重写方法实现 ...
- 【Java】设计模式之模板方法模式
- 好记性不如烂笔头,特将设计模式之模板方法模式记录在我的小仓库. 文章目录 什么是模板方法模式 案例 什么是模板方法模式 简而言之就是一套算法可以适用于多个类,则进行的步骤汇总,让子类别在不改变算法 ...
最新文章
- java调用npoi_NPOI导出数据到Excel
- SQL SERVER 分区表的总结--一些疑问的总结
- 【shell】shell编程(一)-入门
- Linux系统安装VM-Tools
- 《Python游戏编程快速上手》第四章-讲笑话
- Spring Batch –使用JavaConfig替换XML作业配置
- 4月6日米粉节:小米手机新一轮10万台开放购买
- SQL联合主键 查重
- 北大开源分词工具包: 准确率远超THULAC、jieba 分词
- 中input宽度_使用HOG对卫星图像中的船舶进行分类
- xiao zhang jia you
- eXosip订阅问题分析
- 《数据结构导论》之树
- LInux 的流量限制
- C语言——三位数排序
- Elastic Searchable snapshot功能初探 三 (frozen tier)
- 趣味python3编程_Python趣味编程与精彩实例
- gnuplot:散点图
- 最新消息,青岛的农贸市场将迎来大变革
- 干货!!史上最全Java学习视频
热门文章
- Flutter 生成 Icon 提示徽标 Widget
- 真阳率(true positive rate)、假阳率(false positive rate),AUC,ROC
- 微信公众号开发——关注公众号自动回复
- Pagerduty - prometheus - grafana测试告警的使用方法
- stack-es-标准篇-ElasticsearchClient-fields
- 编码训练营 vs 大学:哪个将帮助您获得科技行业最有声望的工作?
- 声源定位MATLAB的程序,求大神改一个声源定位程序 改成放置录音文件然后定位...
- 常用计算机信息的交换标准编码是,信息交换用汉字编码字符集
- 探岳android auto,“本是同根生”它俩谁最优 柯迪亚克 VS 探岳
- The Indian Job