EventBus原理解析


前言

EventBus的核心思想是觀察者模式 (生產/消費者編程模型) 。

SpringBoot+EventBus使用教程(一)

SpringBoot+EventBus使用教程(二)

通過前面的文章我們已經知道,如何使用eventBus了。我們需要先定義一個Observer(前文中的EventListener類),然后將其注冊到eventBus里,通過 @Subscribe 定義消息回調函數。

那我們先看看register(Object object) 和unregister(Object object) 方法。

register (Object object) 解析

可以看到是先通過SubscriberFindingStrategy接口里的findAllSubscribers方法獲取所有標記了@ Subscribe 注解的方法,其中該接口的具體實現是AnnotatedSubscriberFinder類。放到一個guava里定義的Multimap里。然后是把獲取到的methodsInListener放到一個叫subscribersByType的 guava里定義的SetMultimap里 。

findAllSubscribers方法里,最重要的是methodsInListener,它的結構可以簡單理解為一個map,其中key是eventType,在我前文寫的例子中就是com.sww.eventbus.domain.MessageEvent,其中value是subscriber,就是例子中的com.sww.eventbus.listener.EventListener#onMessageEvent。

總之,一句話就是先通過標記找到所有已經注冊進來的觀察者,然后存放到容器里備用。

那unregister就是從容器刪除它們,

unRegister (Object object) 解析

post( Object event)解析

有了觀察者,下面就是發送事件了,閱讀過前文會知道是通過eventBus.post(Object event)來發送事件消息。那咱們來看看這個post方法。

該方法就是從之前的容器subscribersByType里獲取到eventType對應的觀察者,然后組裝成EventWithSubscriber放到隊列里。

然后就是最后的dispatchQueuedEvents(),經過一層層深入進去,可以發現wrapper.handleEvent(event),其中 handleEvent方法就是最終的關鍵了

就是通過Java的反射機制實現。

需要說明的是,如果沒有訂閱者注冊到要發送的event事件上,並且該event不是DeadEvent,那么它將被包裝成DeadEvent中並重新發布。也就是其中這三行代碼索要做的

本文系本人原創,同步更新在我的獨立博客http://791202.com/上,如要轉載,請注明出處!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM