Guava事件总线——全文检索

一、介绍
Guava事件总线实际上是一个“观察者-监听者”实现,通过使用弱引用的方式将各个模块关联起来,下面这几个帖子将EventBus讲解的非常详细,如不是很了解,请移步:

通过EventBus我们可以解决模块间相互耦合,相互依赖,从而达到低耦合便于维护的目的。



二、案例分析——全文检索
以将任务信息添加到全文检索的应用为例

Created with Raphaël 2.1.2 任务信息添加到全文检索 Task Task Index Index Lucene Lucene 我要将T1添加到全文检索中[id, 30] 你记得将T1索引下 我来取下T1的基本信息,记得封装成IndexInfo对象 给你封装了,去死吧!

1. 现在情况
我们现在是通过在任务模块中实现接口IndexEnable,并在需要索引的时候直接调用IndexManager触发索引的过程,故两个模块的依赖方式为:

Created with Raphaël 2.1.2 任务模块 任务模块 全文检索 全文检索 我想当老大 我才是真正的老大 我并不想依赖你

对于任务模块: 我只关注任务信息的生产(黑盒),对于你是否有全文索引,希望并不要影响我。
对于全文检索: 我才是消费者,当时我通过让你们依赖我(锅全给大家啦),我反而成了规则制定者啦.

2. 理想状态
以将任务信息添加到全文检索的应用为例

Created with Raphaël 2.1.2 任务信息添加到全文检索 TASK TASK EventBus EventBus Index Index Lucene Lucene 我将任务T1新增事件发给事件总线 事件总线查找监听者(全文检索) 我想取到T1的信息 这是你想要的信息 开始加工全文检索吧

为什么要改为这样? 我的观点已经在前面阐述,再此再做说明,全文检索是消费者,任务模块是生产者,任务模块是否有全文检索并不影响其正常使用。
这样我们的架构图变为如下

Created with Raphaël 2.1.2 任务模块 任务模块 EventBus EventBus 全文检索 全文检索 依赖 依赖 依赖

从此全文检索变为建立在各个业务模块基础之上的一个新模块,那如何让我们的EventBus来实现呢。



三、具体实现
参考前面提供的例子,内部代码不做例子展示, 本示例的业务场景与前面讨论基本是一样的

猜你喜欢

转载自blog.csdn.net/cockroach02/article/details/79652017