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层,这两层通过监听器模式串联起来,优雅地将模块解耦。