歡迎通路我的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系列
- Spring系列
- Docker系列
- kubernetes系列
- 資料庫+中間件系列
- DevOps系列
歡迎關注公衆号:程式員欣宸
微信搜尋「程式員欣宸」,我是欣宸,期待與您一同暢遊Java世界...
https://github.com/zq2599/blog_demos