理解ProcessFunction的Timer逻辑
欢迎访问我的GitHub
https://github.com/zq2599/blog_demos
内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;
本文概览
- 减少铺垫,长话短说,本文作用是辅助理解Process Function的定时器,仅通过几个关键点把定时器逻辑说清楚,因此文章很短;
- Flink官方有篇文章是讲Process Function的,地址是:https://ci.apache.org/projects/flink/flink-docs-stable/dev/stream/operators/process_function.html
- 这篇文章中给出一个demo,里面用了定时器,核心代码如下图:

4. 建议您先把上述官方代码看一遍,这样再看过下面几个关键点,就能熟练使用此定时器了;
定时器的几个关键点
- 下图红框中的registerEventTimeTimer方法只要执行了,则蓝框中的onTimer方法就会执行(之前曾天真的猜测第二次registerEventTimeTimer会覆盖掉第一次注册的timer,但实际上,只要registerEventTimeTimer的入参不同,就不会覆盖):

- 如下图,onTime方法执行时,timestamp的值是之前registerEventTimeTimer的入参:

- 最后一点也是最关键的一点:每次执行processElement都会修改state,所以,每次onTimer执行的时候,拿到的state都是最近一次processElement中写入的值,因此,假设processElement执行10次,onTimer也会执行10次,但下图红框中的判断只有最后一次等于ture,因为每次判断时,左边的timestamp都是不同的processElement产生的,但右边的result.lastModified却是同一个(最后一次processElement中写入的):

举例说明
第一次执行processElement,时间是12:01:01,因此state中记录的是12:01:01,registerEventTimeTimer入参就是12:11:01(这就是第一个onTimer的timestamp入参)
第二次执行processElement,时间是12:01:05,因此state中记录的是12:01:05,registerEventTimeTimer入参就是12:11:05(这就是第二个onTimer的timestamp入参)
第一个onTimer执行,timestamp是12:11:01,取得state是12:01:05,因此timestamp == result.lastModified + 60000判断为false(12:11:01不等于12:11:05)
第二个onTimer执行,timestamp是12:11:05,取得state是12:01:05,因此timestamp == result.lastModified + 60000判断为false(12:11:05等于12:11:05)
你不孤单,欣宸原创一路相伴
欢迎关注公众号:程序员欣宸
微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界...
https://github.com/zq2599/blog_demos
理解ProcessFunction的Timer逻辑的更多相关文章
- 图解 CSS: 理解样式表的逻辑(转载)
原文:http://www.cnblogs.com/del/archive/2009/02/01/1382141.html 样式表可以是外部的.内联的或嵌入的; 链接外部样式文件一般是:<lin ...
- 如何理解 Python 的赋值逻辑
摘要: 如果你学过 C 语言,那么当你初见 Python 时可能会觉得 Python 的赋值方式略有诡异:好像差不多,但又好像哪里有点不太对劲. 本文比较并解释了这种赋值逻辑上的差异.回答了为什么需要 ...
- 简单理解java中timer的schedule和scheduleAtFixedRate方法的区别
timer的schedule和scheduleAtFixedRate方法一般情况下是没什么区别的,只在某个情况出现时会有区别--当前任务没有来得及完成下次任务又交到手上. 我们来举个例子: 暑假到了老 ...
- CoProcessFunction实战三部曲之三:定时器和侧输出
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 浅谈Js原型的理解
一.js中的原型毫无疑问一个难点,学习如果不深入很容易就晕了! 在参考了多方面的资料后,发现解释都太过专业,对于很多还没有接触过面向对象 语言的小白来说,有理解不了里面的专有名词!如果你没 ...
- Remoting 的“传递的引用”理解
WCf是集大成者,具有其他微软的很多技术,其中分布式上很多借助于Remoting,所以研究一下Remoting有助于理解WCF 提到Remoting就不得不涉及到MarshalByRefObject这 ...
- SpringMVC:学习笔记(1)——理解MVC及快速入门
SprigMVC-理解MVC及快速入门 说明: 传统MVC-->JSPModel2-->Front Controller + Application Controller + Page C ...
- 掀起Azure AD的盖头来——深入理解Microsoft Graph应用程序和服务权限声明
作者:陈希章 发表于 2017年7月12日 引子 这是一篇计划外的文章.我们都知道要进行Microsoft Graph的开发的话,需要进行应用程序注册.这个在此前我已经有专门的文章写过了.但这里存在一 ...
- JAVA个人理解
为了找到别人写的好文章,先分享下自己的知识,找找感觉路线. 学java前接触的c,后来转向java.第一个照面理解的就是面向对象,没想到让我想了好多年.当时有个负责任的老师说面向对象这个词具体释义众说 ...
随机推荐
- centos更新git
安装完centos 7后默认的git版本为1.8,有些软件需要更新版本的git,但是在yum库中并没有更高的git版本,所以需要下载安装包进行手动安装,git下载地址:https://git-scm. ...
- linux命令--使用fsck修复文件系统
使用fsck修复文件系统错误 1.问题描述 服务器maint_samba 由于服务器maint_samba (debian操作系统)没有正常关机,在重新启动过程中/dev/sdb1出现文件系统错误,需 ...
- gitlab使用URL导入远程仓库报错
gitlab使用URL导入远程仓库报错Import url is blocked: Only allowed ports are 80,443, and any over 1024 报错内容为Impo ...
- golang快速入门(四)
提示:本系列文章适合有其他语音基础并对Go有持续冲动的读者 一.golang获取HTTP请求 1.在golang标准库中提供了net包来处理网络连接,通过http.Get创建http请求并返回服务器响 ...
- MySQL中InnoDB存储引擎的实现和运行原理
InnoDB 存储引擎作为我们最常用到的存储引擎之一,充分熟悉它的的实现和运行原理,有助于我们更好地创建和维护数据库表. InnoDB 体系架构 InnoDB 主要包括了: 内存池.后台线程以及存储文 ...
- Nginx 配置实例-配置负载均衡
Nginx 配置实例-配置负载均衡 0. 实例效果 1. 两个 tomcat 的安装(可选) 1.1 tomcat8081 的安装 1.1.1 tomcat8081 安装包的装备 1.1.2 tomc ...
- pytest + allure
参考allure官网: https://docs.qameta.io/allure/#_pytest 1.使用命令pip install pytest-allure安装 注意:我遇到的一个现象,用命令 ...
- NNVM AI框架编译器
NNVM AI框架编译器 深度学习已变得无处不在且不可或缺.看到对在多种平台(例如手机,GPU,IoT设备和专用加速器)上部署深度学习工作负载的需求不断增长.TVM堆栈弥合深度学习框架与面向性能或效率 ...
- MindSpore接口mindspore::api
MindSpore接口mindspore::api Context #include <context.h> Context类用于保存执行中的环境变量. 静态公有成员函数 Instance ...
- 马斯克如何颠覆航天? 1/5385成本,c++和python编程!
马斯克如何颠覆航天? 1/5385成本,c++和python编程! 5月31日,经历了重重困难,马斯克的SpaceX载人飞船成功发射,这是美国自2011年以来首次发射载人航天飞船,也是美国进入由商业主 ...