接口 EventBus
public interface EventBus
事件总线 EventBus,EventBus、业务框架、逻辑服三者是 1:1:1 的关系。
发布事件
在发布事件时
1. 如果相关订阅者在同进程内,可控制同步和异步发送。
2. 如果相关订阅者不在同一个进程内,而是分布在不同的进程中,则只能异步发送(即使使用了同步的方法来发布事件)。
这里的【同步】指的是:发布事件时,相关订阅者执行完成后,主逻辑才会继续往下走。
这里的【异步】指的是:发布事件时,主逻辑不会阻塞,相关订阅者会在其他线程中执行。
无论是同步或者是异步,相关订阅者在执行逻辑服时,默认是线程安全的;这是因为订阅者 EventSubscribe
默认使用的是用户线程执行器。
关于获取 EventBus 的相关示例
for example 1 - 通过 FlowContext 获取对应的 eventBus
EventBus eventBus = flowContext.getEventBus();
eventBus.fire(userLoginEventMessage);
for example 2 - 通过逻辑服 id 获取对应的 eventBus
BrokerClientContext brokerClientContext = flowContext.getBrokerClientContext();
String id = brokerClientContext.getId();
EventBus eventBus = EventBusRegion.getEventBus(id);
for example 3 - 通过业务框架获取对应的 eventBus
BarSkeleton barSkeleton = ...
EventBus eventBus = barSkeleton.option(SkeletonAttr.eventBus);
for example 4 - 在初始化时,自己保存一下引用
public BarSkeleton createBarSkeleton() {
// 业务框架构建器
var builder = ...
// 游戏逻辑服添加 EventBusRunner,用于处理 EventBus 相关业务
builder.addRunner(new EventBusRunner() {
@Override
public void registerEventBus(EventBus eventBus, BarSkeleton skeleton) {
// 这里保存一下 EventBus 的引用
}
});
}
fire 系列提供了多个种类的事件发布机制
1. fire 发送事件给订阅者,这些订阅者包括 a. 给当前进程所有逻辑服的订阅者发送事件消息。 b. 给其他进程的订阅者发送事件消息。 2. fireLocal 给当前进程所有逻辑服的订阅者发送事件消息 3. fireMe 仅给当前 EventBus 的订阅者发送事件消息 4. fireAny 发送事件给订阅者,这些订阅者包括 a. 给当前进程所有逻辑服的订阅者发送事件消息。 b. 给其他进程的订阅者发送事件消息。 c. 当有同类型的多个逻辑服实例时,只会给同类型其中的一个逻辑服发送事件。 fire 系列提供了多个种类的事件发布机制,以上方法默认是异步的,而相关同步方法则以 fireXXXSync 命名。便捷使用 -
FlowContext
除了可以通过 EventBus 发布事件外,框架还在 FlowContext
中提供了 EventBus 的相关方法。
FlowContext 内部使用 EventBus 来发布事件。
更多使用示例请阅读 FlowContext - 分布式事件总线文档
- 从以下版本开始:
- 21
- 作者:
- 渔民小镇
- 另请参阅:
- 日期:
- 2023-12-24
-
方法概要
修饰符和类型方法说明default EventBusMessage
createEventBusMessage
(Object eventSource) 创建事件消息void
fire
(EventBusMessage eventBusMessage) [异步] 发送事件给所有订阅者default void
[异步] 发送事件给所有订阅者void
fireAny
(EventBusMessage eventBusMessage) [异步] 给当前进程的订阅者和远程进程的订阅者送事件消息,如果同类型逻辑服存在多个,只会给其中一个实例发送。default void
[异步] 给当前进程的订阅者和远程进程的订阅者送事件消息,如果同类型逻辑服存在多个,只会给其中一个实例发送。void
fireAnySync
(EventBusMessage eventBusMessage) [同步] 给当前进程的订阅者和远程进程的订阅者送事件消息,如果同类型逻辑服存在多个,只会给其中一个实例发送。default void
fireAnySync
(Object eventSource) [同步] 给当前进程的订阅者和远程进程的订阅者送事件消息,如果同类型逻辑服存在多个,只会给其中一个实例发送。void
fireLocal
(EventBusMessage eventBusMessage) [异步] 给当前进程所有逻辑服的订阅者发送事件消息default void
[异步] 给当前进程所有逻辑服的订阅者发送事件消息void
fireLocalNeighbor
(EventBusMessage eventBusMessage) [异步] 给当前进程其他逻辑服的订阅者发送事件消息,不包括当前 EventBus。default void
fireLocalNeighbor
(Object eventSource) [异步] 给当前进程其他逻辑服的订阅者发送事件消息,不包括当前 EventBus。void
fireLocalNeighborSync
(EventBusMessage eventBusMessage) [同步] 给当前进程其他逻辑服的订阅者发送事件消息,不包括当前 EventBus。default void
fireLocalNeighborSync
(Object eventSource) [同步] 给当前进程其他逻辑服的订阅者发送事件消息,不包括当前 EventBus。void
fireLocalSync
(EventBusMessage eventBusMessage) [同步] 给当前进程所有逻辑服的订阅者发送事件消息default void
fireLocalSync
(Object eventSource) [同步] 给当前进程所有逻辑服的订阅者发送事件消息void
fireMe
(EventBusMessage eventBusMessage) [异步] 仅给当前 EventBus 的订阅者发送事件消息default void
[异步] 仅给当前 EventBus 的订阅者发送事件消息void
fireMeSync
(EventBusMessage eventBusMessage) [同步] 仅给当前 EventBus 的订阅者发送事件消息default void
fireMeSync
(Object eventSource) [同步] 仅给当前 EventBus 的订阅者发送事件消息void
fireSync
(EventBusMessage eventBusMessage) [同步] 发送事件给所有订阅者default void
[同步] 发送事件给所有订阅者get 事件总线逻辑服相关信息get 事件监听器get 事件消息创建者get 线程执行器管理域getId()
EventBus id。get 订阅者线程执行器选择策略listSubscriber
(EventBusMessage eventBusMessage) 事件消息所对应的订阅者当前 eventBus 订阅的所有事件源主题void
注册订阅者void
setBrokerClientContext
(BrokerClientContext brokerClientContext) 当前服务器上下文(逻辑服)void
setEventBrokerClientMessage
(EventBrokerClientMessage eventBrokerClientMessage) set 事件总线逻辑服相关信息void
setEventBusListener
(EventBusListener eventBusListener) set 事件监听器void
setEventBusMessageCreator
(EventBusMessageCreator eventBusMessageCreator) set 事件消息创建者,EventBusMessage creatorvoid
setExecutorRegion
(ExecutorRegion executorRegion) set 线程执行器管理域void
setSubscribeExecutorStrategy
(SubscribeExecutorStrategy subscribeExecutorStrategy) set 订阅者线程执行器选择策略void
setSubscriberInvokeCreator
(SubscriberInvokeCreator subscriberInvokeCreator) set SubscriberInvokeCreator
-
方法详细资料
-
getId
String getId()EventBus id。EventBus、业务框架、逻辑服三者是 1:1:1 的关系,默认该 id 是逻辑服的 id;- 返回:
- id
-
register
注册订阅者- 参数:
eventBusSubscriber
- 订阅者
-
listSubscriber
事件消息所对应的订阅者- 参数:
eventBusMessage
- 事件消息- 返回:
- 所对应的订阅者
-
listTopic
当前 eventBus 订阅的所有事件源主题- 返回:
- 当前 eventBus 订阅的所有事件源主题
-
fire
[异步] 发送事件给所有订阅者1 给当前进程所有逻辑服的订阅者发送事件消息 2 给其他进程的订阅者发送事件消息
- 参数:
eventBusMessage
- 事件消息
-
fireSync
[同步] 发送事件给所有订阅者1 [同步] 给当前进程所有逻辑服的订阅者发送事件消息 2 [异步] 给其他进程的订阅者发送事件消息 注意,这里的同步仅指当前进程订阅者的同步,对其他进程中的订阅者无效(处理远程订阅者使用的是异步)。
- 参数:
eventBusMessage
- 事件消息
-
fire
[异步] 发送事件给所有订阅者1 给当前进程所有逻辑服的订阅者发送事件消息 2 给其他进程的订阅者发送事件消息
- 参数:
eventSource
- 事件源
-
fireSync
[同步] 发送事件给所有订阅者1 [同步] 给当前进程所有逻辑服的订阅者发送事件消息 2 [异步] 给其他进程的订阅者发送事件消息 注意,这里的同步仅指当前进程订阅者的同步,对其他进程中的订阅者无效(处理远程订阅者使用的是异步)。
- 参数:
eventSource
- 事件源
-
fireLocal
[异步] 给当前进程所有逻辑服的订阅者发送事件消息- 参数:
eventSource
- 事件源
-
fireLocal
[异步] 给当前进程所有逻辑服的订阅者发送事件消息- 参数:
eventBusMessage
- 事件消息
-
fireLocalSync
[同步] 给当前进程所有逻辑服的订阅者发送事件消息- 参数:
eventSource
- 事件源
-
fireLocalSync
[同步] 给当前进程所有逻辑服的订阅者发送事件消息- 参数:
eventBusMessage
- 事件消息
-
fireMe
[异步] 仅给当前 EventBus 的订阅者发送事件消息已注册到
register(Object)
的订阅者- 参数:
eventSource
- 事件源
-
fireMe
[异步] 仅给当前 EventBus 的订阅者发送事件消息已注册到
register(Object)
的订阅者- 参数:
eventBusMessage
- 事件消息
-
fireMeSync
[同步] 仅给当前 EventBus 的订阅者发送事件消息已注册到
register(Object)
的订阅者- 参数:
eventSource
- 事件源
-
fireMeSync
[同步] 仅给当前 EventBus 的订阅者发送事件消息已注册到
register(Object)
的订阅者- 参数:
eventBusMessage
- 事件消息
-
fireAny
[异步] 给当前进程的订阅者和远程进程的订阅者送事件消息,如果同类型逻辑服存在多个,只会给其中一个实例发送。假设现在有一个发放奖励的邮件逻辑服,我们启动了两个(或者说多个)邮件逻辑服实例来处理业务。 当我们使用 fireAny 方法发送事件时,只会给其中一个实例发送事件。
- 参数:
eventSource
- 事件源
-
fireAny
[异步] 给当前进程的订阅者和远程进程的订阅者送事件消息,如果同类型逻辑服存在多个,只会给其中一个实例发送。假设现在有一个发放奖励的邮件逻辑服,我们启动了两个(或者说多个)邮件逻辑服实例来处理业务。 当我们使用 fireAny 方法发送事件时,只会给其中一个实例发送事件。
- 参数:
eventBusMessage
- 事件消息
-
fireAnySync
[同步] 给当前进程的订阅者和远程进程的订阅者送事件消息,如果同类型逻辑服存在多个,只会给其中一个实例发送。假设现在有一个发放奖励的邮件逻辑服,我们启动了两个(或者说多个)邮件逻辑服实例来处理业务。 当我们使用 fireAny 方法发送事件时,只会给其中一个实例发送事件。
- 参数:
eventSource
- 事件源
-
fireAnySync
[同步] 给当前进程的订阅者和远程进程的订阅者送事件消息,如果同类型逻辑服存在多个,只会给其中一个实例发送。假设现在有一个发放奖励的邮件逻辑服,我们启动了两个(或者说多个)邮件逻辑服实例来处理业务。 当我们使用 fireAny 方法发送事件时,只会给其中一个实例发送事件。
- 参数:
eventBusMessage
- 事件消息
-
fireLocalNeighbor
[异步] 给当前进程其他逻辑服的订阅者发送事件消息,不包括当前 EventBus。- 参数:
eventSource
- 事件源
-
fireLocalNeighbor
[异步] 给当前进程其他逻辑服的订阅者发送事件消息,不包括当前 EventBus。- 参数:
eventBusMessage
- 事件消息
-
fireLocalNeighborSync
[同步] 给当前进程其他逻辑服的订阅者发送事件消息,不包括当前 EventBus。- 参数:
eventSource
- 事件源
-
fireLocalNeighborSync
[同步] 给当前进程其他逻辑服的订阅者发送事件消息,不包括当前 EventBus。- 参数:
eventBusMessage
- 事件消息
-
setSubscribeExecutorStrategy
set 订阅者线程执行器选择策略- 参数:
subscribeExecutorStrategy
- 订阅者线程执行器选择策略
-
getSubscribeExecutorStrategy
SubscribeExecutorStrategy getSubscribeExecutorStrategy()get 订阅者线程执行器选择策略- 返回:
- 订阅者线程执行器选择策略
-
setSubscriberInvokeCreator
set SubscriberInvokeCreator- 参数:
subscriberInvokeCreator
- SubscriberInvokeCreator
-
setEventBusMessageCreator
set 事件消息创建者,EventBusMessage creator- 参数:
eventBusMessageCreator
- EventBusMessageCreator
-
setEventBusListener
set 事件监听器- 参数:
eventBusListener
- 事件监听器
-
getEventBusListener
EventBusListener getEventBusListener()get 事件监听器- 返回:
- 事件监听器
-
setEventBrokerClientMessage
set 事件总线逻辑服相关信息- 参数:
eventBrokerClientMessage
- 事件总线逻辑服相关信息
-
setBrokerClientContext
当前服务器上下文(逻辑服)- 参数:
brokerClientContext
- 当前服务器上下文(逻辑服)
-
setExecutorRegion
set 线程执行器管理域- 参数:
executorRegion
- 线程执行器管理域
-
getExecutorRegion
ExecutorRegion getExecutorRegion()get 线程执行器管理域- 返回:
- 线程执行器管理域
-
getEventBusMessageCreator
EventBusMessageCreator getEventBusMessageCreator()get 事件消息创建者- 返回:
- 事件消息创建者
-
getEventBrokerClientMessage
EventBrokerClientMessage getEventBrokerClientMessage()get 事件总线逻辑服相关信息- 返回:
- 事件总线逻辑服相关信息
-
createEventBusMessage
创建事件消息- 参数:
eventSource
- 事件源- 返回:
- 事件消息
-