理解ProcessFunction的Timer逻辑

简介: 把官方demo中的timer逻辑理清楚,学会使用Timer

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码): https://github.com/zq2599/blog_demos

本文概览

在这里插入图片描述

  • 建议您先把上述官方代码看一遍,这样再看过下面几个关键点,就能熟练使用此定时器了;

定时器的几个关键点

  • 下图红框中的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)

欢迎关注阿里云开发者社区博客:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...
相关文章
|
3月前
|
测试技术 PHP
Swoole 源码分析之 Timer 定时器模块
Swoole 中的毫秒精度的定时器。底层基于 `epoll_wait` 和 `setitimer` 实现,数据结构使用最小堆,可支持添加大量定时器。
71 0
Swoole 源码分析之 Timer 定时器模块
|
Java 调度
架构系列——定时任务中的Timer类使用简析
架构系列——定时任务中的Timer类使用简析
|
JavaScript 前端开发
JS引擎的执行机制event loop
JS引擎的执行机制event loop
66 0
|
Java 测试技术
在多线程中自定义实现定时器(Timer)
在多线程中自定义实现定时器(Timer)
|
Serverless
事件驱动(Event driven)——函数计算异步调用
事件驱动(Event driven)——函数计算异步调用自制脑图
92 0
事件驱动(Event driven)——函数计算异步调用
|
Java API 调度
Timer - 基础篇
Timer - 基础篇
170 0
Timer - 基础篇
Rxjs Observable.pipe 传入多个 operators 的执行逻辑分析
Rxjs Observable.pipe 传入多个 operators 的执行逻辑分析
Rxjs Observable.pipe 传入多个 operators 的执行逻辑分析
|
API 调度 Android开发
【Android 异步操作】Timer 定时器 ( Timer 与 TimerTask 基本使用 | Timer 定时器常用用法 | Timer 源码分析 )
【Android 异步操作】Timer 定时器 ( Timer 与 TimerTask 基本使用 | Timer 定时器常用用法 | Timer 源码分析 )
896 0
|
Java
Java 中Timer和TimerTask 定时器和定时任务使用的例子
<p>转自:<a target="_blank" href="http://blog.csdn.net/kalision/article/details/7692796">http://blog.csdn.net/kalision/article/details/7692796</a></p> <p><span style="font-family:Arial; font-size:14
5030 0
C#.NET使用Task,await,async,异步执行控件耗时事件(event),不阻塞UI线程和不跨线程执行UI更新,以及其他方式比较
原文:C#.NET使用Task,await,async,异步执行控件耗时事件(event),不阻塞UI线程和不跨线程执行UI更新,以及其他方式比较 使用Task,await,async,异步执行事件(event),不阻塞UI线程和不跨线程执行UI更新   使用Task,await,async 的异步模式 去执行事件(event) 解决不阻塞UI线程和不夸跨线程执行UI更新报错的最佳实践,附加几种其他方式比较 由于是Winform代码和其他原因,本文章只做代码截图演示,不做界面UI展示,当然所有代码都会在截图展示。
4881 0