持续会话
当你需要在一个监听函数中,持续的处理连续或多个事件的时候,或许持续会话可以为你提供一些微不足道的帮助。
本章节将会试着向你介绍如何使用 持续会话上下文(ContinuousSessionContext
) 来在一个监听函数中等待并处理其他事件。
持续会话由 核心模块( simbot-core
) 中的 作用域( SimpleScope
) 提供,不属于标准API的一部分。
因此通常情况下,持续会话仅支持 核心模块 及其衍生模块(包括 Boot核心模块 ( simboot-core
)
和 Spring Boot启动器 ( simbot-spring-boot-starter
))。
持续会话相关api尚处于实验阶段,可能会存在各种问题并且可能会随时变更API。
下文介绍中出现的代码示例如非特殊说明则将会有所简化。
- Kotlin
- Java
在 Kotlin 中,将会以相同风格的代码来 核心模块 和 Boot模块 下的监听函数。
例如下述代码:
suspend fun EventProcessingContext.onEvent(event: Event) {
// Here ...
}
将可以代表为下列情况:
- 核心模块
- Boot模块
suspend fun main() {
createSimpleApplication {
listeners {
listen(Event) {
process { event -> // this: EventListenerProcessingContext
// Here ...
}
}
}
}.join()
}
或其他类似的事件监听形式
@Listener
suspend fun EventProcessingContext.onEvent(event: Event) {
// Here ...
}
在 Java 中,通常使用的为 Boot模块 或 Spring Boot启动器。 因此示例代码会以Boot模块下的风格进行展示,例如:
@Listener
public void onEvent(ContinuousSessionContext sessionContext, Event event) {
// Here ...
}
获取
通过 SimpleScope
获取
使用之前,最重要的事情就是需要获取它。开篇我们提到,ContinuousSessionContext
是由核心模块中的 SimpleScope
所提供的,
因此获取持续会话最基本 的方式便是通过 事件处理上下文( EventProcessingContext
或 EventListenerProcessingContext
)
和 SimpleScope
来获取它。
- Kotlin
- Java
suspend fun EventProcessingContext.onEvent(event: Event) {
val sessionContext: ContinuousSessionContext? = this[SimpleScope.ContinuousSession]
// ...
}
上述代码中可以看到,通过 context[...]
得到的结果是可能为空的。当你使用的是第三方提供的实现或者非核心模块或其衍生模块的话,
你可能无法得到所需的结果。
文章的后续我们将会默认将当前环境视为处于核心模块或其衍生模块中,并假定获取的结果不会为null。 但在正常使用的时候,还是应当多加留意。
@Listener
public void onEvent(EventProcessingContext context, FriendEvent event) {
final ContinuousSessionContext sessionContext = context.get(SimpleScope.ContinuousSession);
}
上述代码中,通过 context.get(...)
得到的结果是可能为空的。当你使用的是第三方提供的实现或者非核心模块或其衍生模块的话,
你可能无法得到所需的结果。
文章的后续我们将会默认将当前环境视为处于核心模块或其衍生模块中,并假定获取的结果不会为null。 但在正常使用的时候,还是应当多加留意。
通过扩展属性获取
核心模块通过 SimpleScope
提供了一系列用于简化获取其内属性的扩展属性,其中也包括针对于从 EventProcessingContext
或 EventListenerProcessingContext
中获取 ContinuousSessionContext
的属性。
- Kotlin
- Java
continuousSession
获取 EventProcessingContext
中的 ContinuousSessionContext
。当无法获取、不存在或不支持时将会抛出异常。
suspend fun EventProcessingContext.onEvent(event: Event) {
val sessionContext: ContinuousSessionContext = this.continuousSession
}