差異處
這裏顯示兩個版本的差異處。
Both sides previous revision 前次修改 下次修改 | 前次修改 | ||
java:basic:queue:notificationbufferwithdelayqueue [2019/03/23 16:27] tony |
java:basic:queue:notificationbufferwithdelayqueue [2019/03/23 16:39] tony [後記] |
||
---|---|---|---|
行 48: | 行 48: | ||
* getDelay是讓DelayQueue知道要等待多久才要將結果回應給client。 | * getDelay是讓DelayQueue知道要等待多久才要將結果回應給client。 | ||
===== NotificationBuffer ===== | ===== NotificationBuffer ===== | ||
- | 為了讓特定client的多次通知合併成同一個,因此我做了一個extends DelayQueue的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; | ||
行 77: | 行 77: | ||
} | } | ||
</code> | </code> | ||
+ | 因為我僅對通知者有興趣,因此我可以將多出來的事件直接省略;假如你對於每次的通知內容都有興趣,你可以在這個物件中將多個NotifiedObject給合併成一個。 | ||
===== Unit Test ===== | ===== Unit Test ===== | ||
+ | 我的單元測試主要有兩個目標,一個是確認重複的通知有被濾掉,第二個則是確認buffer是可以被重複使用兩次以上的: | ||
<code java> | <code java> | ||
@Test(timeout=10*1000) | @Test(timeout=10*1000) | ||
行 131: | 行 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]] |