Tribes為了更清晰更好地劃分職責,它被設計成用IO層和應用層,IO層專心負責網絡傳輸方面的邏輯處理,把接收到的數據往應用層傳送,當然應用層發送的數據也是通過此IO層發送,數據傳往應用層后必須要留一些處理入口供應用層進行邏輯處理,而考慮系統解耦,這個入口最好的方式是使用監聽器模式,在底層發生各種事件時觸發所有安裝好的監聽器,使之執行監聽器里面的處理邏輯。這些事件主要包含了集群成員的加入和退出、消息報文接收完畢等信息,所以整個消息流轉過程被分成兩類監聽器,一類是跟集群成員的變化相關的監聽器MembershipListener,另外一類是跟集群消息接收發送相關的監聽器ChannelListener。應用層只要關注這兩個接口就行了,寫好各種處理邏輯的監聽器添加到通道中即可。
下面是這兩個監聽器的接口,從接口定義的方法可以很清晰地看到各個方法被調用的時機,MembershipListener類型中memberadd是有成員加入時調用的方法,memberDisappeared是成員退出時調用的方法,ChannelListener類型中accept用于判斷是否接受消息,messageReceived用于對消息處理的方法,應用層把邏輯分別寫到這幾個方法就可以在對應時刻執行相應的邏輯。
~~~
public?interface?MembershipListener?{
????public?void?memberAdded(Member?member);
????public?void?memberDisappeared(Member?member);
}
public?interface?ChannelListener?{
????public?void?messageReceived(Serializable?msg,?Member?sender);
????public?boolean?accept(Serializable?msg,?Member?sender);
}
~~~

我們可以在應用層自定義若干監聽器并且添加到GroupChannel中的兩個監聽器列表中,GroupChannel其實可以看成是一個封裝了IO層的抽象容器,它會在各個適當的時期遍歷監聽器列表中的所有監聽器并調用監聽器對應的方法,即執行應用層定義的業務邏輯,至此完成了數據從IO層流向應用層并完成處理。兩種類型的監聽器給應用層提供了處理入口,應用層只需關注邏輯處理,而其他的IO操作則交由IO層,這兩層通過監聽器模式串聯起來,優雅地將模塊解耦。
喜歡java的可以交個朋友:
