EventBus的核心思想是观察者模式 (生产/消费者编程模型) 。

SpringBoot+EventBus使用教程(一)

SpringBoot+EventBus使用教程(二)

通过前面的文章我们已经知道,如何使用eventBus了。我们需要先定义一个Observer(前文中的EventListener类),然后将其注册到eventBus里,通过 @Subscribe 定义消息回调函数。

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

register (Object object) 解析

 
1
2
3
4
5
6
7
8
9
10
{
=
;
;
{
;
{
;
}
}

可以看到是先通过SubscriberFindingStrategy接口里的findAllSubscribers方法获取所有标记了@ Subscribe 注解的方法,其中该接口的具体实现是AnnotatedSubscriberFinder类。放到一个guava里定义的Multimap里。然后是把获取到的methodsInListener放到一个叫subscribersByType的 guava里定义的SetMultimap里 。

 
1
2
3
4
5
6
7
8
9
10
11
{
;
;
{
;
;
;
;
}
;
}

findAllSubscribers方法里,最重要的是methodsInListener,它的结构可以简单理解为一个map,其中key是eventType,在我前文写的例子中就是com.sww.eventbus.domain.MessageEvent,其中value是subscriber,就是例子中的com.sww.eventbus.listener.EventListener#onMessageEvent。

总之,一句话就是先通过标记找到所有已经注册进来的观察者,然后存放到容器里备用。

那unregister就是从容器删除它们,

unRegister (Object object) 解析

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
;
:
{
;
;
 
;
{
;
{
(
;
}
;
{
;
}
}
}

post( Object event)解析

有了观察者,下面就是发送事件了,阅读过前文会知道是通过eventBus.post(Object event)来发送事件消息。那咱们来看看这个post方法。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
;
 
;
{
;
{
;
 
{
;
{
;
}
}
{
;
}
}
 
{
;
}
 
;
}

该方法就是从之前的容器subscribersByType里获取到eventType对应的观察者,然后组装成EventWithSubscriber放到队列里。

 
1
2
3
{
;
}

然后就是最后的dispatchQueuedEvents(),经过一层层深入进去,可以发现wrapper.handleEvent(event),其中 handleEvent方法就是最终的关键了

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
;
{
;
{
;
{
;
{
{
;
}
;
}
}

就是通过Java的反射机制实现。

需要说明的是,如果没有订阅者注册到要发送的event事件上,并且该event不是DeadEvent,那么它将被包装成DeadEvent中并重新发布。也就是其中这三行代码索要做的

 
1
2
3
{
;
}

本文系本人原创,同步更新在我的独立博客http://791202.com/上,如要转载,请注明出处!

相关文章:

  • 2021-05-23
  • 2022-02-24
  • 2021-06-28
  • 2021-08-18
  • 2021-07-21
  • 2021-04-30
  • 2022-12-23
  • 2021-09-27
猜你喜欢
  • 2021-06-03
  • 2021-12-01
  • 2021-08-30
  • 2021-10-20
  • 2021-12-09
  • 2021-09-24
  • 2022-12-23
相关资源
相似解决方案