差異處

這裏顯示兩個版本的差異處。

連向這個比對檢視

Both sides previous revision 前次修改
下次修改
前次修改
java:basic:queue:notificationbufferwithdelayqueue [2019/03/23 16:16]
tony [NotifiedObject]
java:basic:queue:notificationbufferwithdelayqueue [2023/06/25 09:48] (目前版本)
行 13: 行 13:
   * NotificationBuffer:​ 儲存通知資料物件的Buffer。   * NotificationBuffer:​ 儲存通知資料物件的Buffer。
 ===== NotifiedObject ===== ===== NotifiedObject =====
-要實作自己的delayed物件,必須implements Dealyed介面,而它是extends Comparable介面,因此我們必須要實作compareTo與getDelay;除此之外,這個物件為了達到需求,會記載著通知的id與工作開始時間。+要實作自己的delayed物件,必須implements Dealyed介面,而它是extends Comparable介面,因此我們必須要實作compareTo與getDelay;除此之外,這個物件為了達到需求,會記載區別client的id與工作開始時間。可以參考底下程式碼:​
 <code java> <code java>
 import java.util.concurrent.Delayed;​ import java.util.concurrent.Delayed;​
行 43: 行 43:
 } }
 </​code>​ </​code>​
 +有幾個重點:​
 +  * startTime在建立物件時,會根據目前時間與預期delay時間去算出來;delay時間就是你希望要緩衝的時間區間。
 +  * compareTo主要用途是給PriorityQueue決定先後順序用的,這可以讓DelayQueue取出最靠近現在時間的NotifiedObject。
 +  * getDelay是讓DelayQueue知道要等待多久才要將結果回應給client。
 ===== NotificationBuffer ===== ===== NotificationBuffer =====
 +為了讓特定client的多次通知合併成同一個,因此我做了一個extends DelayQueue的NotificationBuffer。在這個buffer中,idCache用以紀錄已經在NotifiedObject的oid,用以在add時略過不需要的通知資料;在take後,也會將oid從idCache中移除,以確保後來的通知能夠被處理:​
 <code java> <code java>
 import java.util.Set;​ import java.util.Set;​
行 72: 行 77:
 } }
 </​code>​ </​code>​
 +因為我僅對通知者有興趣,因此我可以將多出來的事件直接省略;假如你對於每次的通知內容都有興趣,你可以在這個物件中將多個NotifiedObject給合併成一個。
 ===== Unit Test ===== ===== Unit Test =====
 +我的單元測試主要有兩個目標,一個是確認重複的通知有被濾掉,第二個則是確認buffer是可以被重複使用兩次以上的:​
 <code java> <code java>
 @Test(timeout=10*1000) @Test(timeout=10*1000)
行 126: 行 133:
 } }
 </​code>​ </​code>​
 +===== 後記 =====
 +針對這樣的需求,Camel的Aggregator是可以達到部分的效果,可以參考[[java:​apache_camel:​aggregator:​helloworld|這篇文章]];我會說部分效果的原因,是因為Aggredator無法根據不同client到達的時間去計算delay,它是以第一個client到達的時間為準。至於要相依於框架還是要自己造輪子,就看各位的考量了。
 ===== Reference ===== ===== Reference =====
   * [[https://​www.baeldung.com/​java-delay-queue|Guide to DelayQueue]]   * [[https://​www.baeldung.com/​java-delay-queue|Guide to DelayQueue]]