ContinuousSessionContext
持续会话(continuous session)管理器, 用于承载一组 ContinuousSessionProvider 和 ContinuousSessionReceiver 的上下文。用于构建与管理 ContinuousSession。
持续会话
持续会话(continuous session) 是一种用于解决在同一组逻辑中连续处理多个'事件 T'、并响应 '结果 R' 的解决方案。 ContinuousSessionContext 本身可灵活定制这个所谓 '事件' 的类型, 其主要应用场景为借助子类型 EventContinuousSessionContext 在 simbot 的事件调度中使用。
假如,有一个事件类型为 Int、响应结果为 String 的一组持续会话:
// 假设这个 session context 的'事件'类型为 Int, '结果'类型为 String
val context = ContinuousSessionContext<Int, String> = ...
val session = context.session(Key()) { // this: ContinuousSessionReceiver
// receiver 逻辑在异步中,等待外界的事件推送
val next = await { it -> it.toString() }
} ↑ |
|-------------| |
| |
|--------------- | --------|
| |
↓ |
val result = session.push(1) // 推送 '事件', 得到 '结果'
session.join() // session 内逻辑结束后便会正常终止
assertTrue(session.isCompleted)Content copied to clipboard
在 simbot 的事件调度中的简单应用:
suspend fun handle(handleEvent: Event, sessionContext: EventContinuousSessionContext): EventResult {
// event: 接收到的事件
// sessionContext: 假设它是在 application 的 plugins 中获取到的. 可参见 `EventContinuousSessionContext` 的文档说明。
val key = computeKey(handleEvent) // 根据 handleEvent, 分配一个与它的唯一会话对应的 key.
val session = context.session(key, EXISTING) {
// this: ContinuousSessionReceiver<Event, EventResult>
// receiver 逻辑在异步中,等待外界的事件推送
// 此处的逻辑:
// 如果收到的事件 event 经过 check 的判断后符合要求,
// 则返回 EventResult.empty(isTruncated = true), 代表此会话已经截取此事件,
// 不要让事件再向后续的其他处理器传递;
// 否则(即不符合你的业务逻辑判断的条件)则返回一个 EventResult.invalid(), 代表无效的结果。
val next = await { event ->
↑ if (check(event)) EventResult.empty(isTruncated = true)
| else EventResult.invalid()
| }
} | \-----------------------------------------------------------/
| |
|-------------| |
| |
|--------------- | --------|
↓ |
return session.push(handleEvent) // 推送 '事件', 得到 '结果'
// 直接返回这个结果
}Content copied to clipboard
Author
ForteScarlet
See also
Inheritors
Functions
Link copied to clipboard
判断是否包含某个 key 对应的会话。
Link copied to clipboard
根据 key 获取指定的 ContinuousSessionProvider 并在找不到时返回 null。
Link copied to clipboard
移除某个指定 key 的会话。 remove 仅会从记录中移除,不会使用 ContinuousSessionProvider.cancel, 需要由调用者主动使用。
Link copied to clipboard
open fun <C> session(key: ContinuousSessionKey<C>, inSession: InSession<C, T, R>): ContinuousSessionProvider<C, T, R>
尝试创建一组 ContinuousSession, 并在出现 key 冲突时使用 ConflictStrategy.FAILURE 作为冲突解决策略。
abstract fun <C> session(key: ContinuousSessionKey<C>, strategy: ContinuousSessionContext.ConflictStrategy = ConflictStrategy.FAILURE, inSession: InSession<C, T, R>): ContinuousSessionProvider<C, T, R>
尝试创建一组 ContinuousSession 并返回其中的 ContinuousSessionProvider。 在出现 key 冲突时基于 strategy 策略处理冲突。