遇到的問題

對于以上代碼,我們進行keyby之后,我們new 了物件,我們會以為里面所有的資料都是獨一份,和別的key是隔離的,
所以利索當然的:這個型別物件的屬性:ExitLessonCountMessage有classId,lessonId,studentId 我們也會認為是獨一份和別的keyby之后的資料不重用,

當我們入下圖我們在定時器觸發的時候,用了classId,lessonId,studentId 一直不是自己想要的資料, 導致資料混亂,百思不得其解,

原因分析:
最后經過反復看原始碼,我們雖然keyBy 之后 并且new ExitLessonCountMessage物件,但是在flink中,假如有物件在,就不會重新new 物件,而是直接重復使用,
這樣就會導致里面的屬性classId,lessonId,studentId 一直都被重用,當你定時器觸發的時候就是最后定時器觸發前的最后一條記錄,而不是我們自己原來存的值,
解決辦法:
第一種:
在創建定時器的時候把這三個屬性放到狀態里面存盤,定時器觸發的時候取出來,這時候一定是唯一的,一定是你想要的,
第二種:
在我們觸發定時器時,我們從定時器的背景關系中再取一次資料,賦值給lessonId,studentId,這樣下面用到的值肯定就是我們定時器觸發所需要的資料,

注意:第二種情況,只適合我們所需要的資料在key中,我們才能取到,要不然只能用第一種方法
思考:
1.flink快就是因為在很多種情況下代碼是重用的,(例如迭代器,keyby之后物件的屬性)
2.keyby之后并不會把所有的變數,物件,資料隔離,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/272288.html
標籤:其他
上一篇:小白要努力之java學習運算子
