跳到主要内容

2022年第40周周报

· 阅读需 6 分钟
Scarlet Forliy

大概是2022年第40周周报喵。

时间如孩童, 嬉笑市井间; 时间若川流, 涓涓石罅隙.

🚀 核心库更新

本周 核心库 暂时没有新的版本更新,不过已经有了几个预备特性将会在下个版本中呈现:

  • EventResult 结构优化; 响应值支持处理 CompletableFutureDeferred (#466)
  • 调整监听函数的注册、调度机制; 弃用 EventListener 中的idpriorityisAsync属性并将这些信息调整到注册时 (#465)
  • 完善 DelayableCompletableFuture 内容 (#463)

让我们简单聊聊这几个特性.

完善 DelayableCompletableFuture 内容 (#463)

在之前的版本中, DelayableCompletableFutureCompletableFuture 之间其实是相互独立的, 而在 #463 的优化之后, 它们之间便有了更多的共通性.

调整监听函数的注册、调度机制; 弃用 EventListener 中的idpriorityisAsync属性并将这些信息调整到注册时 (#465)

我们在很久之前便注意到,经常有人会比较关心或者期望能够拥有一个动态注册监听函数的特性与能力。 在这之前,simbot核心中提供的事件调度器推荐预注册监听函数,支持后续注册而不支持函数移除

原本的调度器中,会对所有的监听函数进行预处理与缓存,如果频繁的动态增删监听函数会大大降低整体效率。 而这次在 #465 中, 我们对其内部的整体结构做了调整,在保留了原有大部分特性的情况下,支持的监听函数的动态注册与删除。

createSimpleApplication {
listeners {
FriendEvent { // this: EventListenerProcessingContext
// 当前所处的监听函数的句柄.
val currentHandle = this.listenerHandle

// 得到当前监听函数所属的容器
val currentContainer = currentHandle.container
// 动态注册一个新的监听函数, 并得到这个新函数的句柄
val newListenerHandle = currentContainer.register(buildSimpleListener(FriendMessageEvent) {
match { /* ... */ true }
process { /* 处理事件 */ }
})

// 等待0.5s
delay(500)

// 删除这个监听函数.
newListenerHandle.dispose()

// 删除自己(当前的监听函数)
currentHandle.dispose()
}
}
}

回到标题,我们注意到了 EventListener 中的大部分属性对于其本身来讲并不必要,对于一个函数来讲,他不应关心自己是不是唯一(id), 不应关心自己的优先级(priority),也不需要关心自己是不是拥有一个异步标识(isAsync)(甚至可以在逻辑中自行实现异步行为)。 因此,我们弃用了 EventListener 中这些没有必要的属性,并将这些属性整合到了注册时才需要提供:

val application = createSimpleApplication {
}
// 得到事件管理器
val manager = application.eventListenerManager
// 构建一个监听函数
val listener = buildSimpleListener(FriendEvent) {
match { /* ... */ true }
process { /* ... */ }
}
// 允许重复注册
manager.register(listener)
manager.register(listener)
// 提供更多'属性'
manager.register(listener.toRegistrationDescription {
priority = PriorityConstant.FIRST
isAsync = true
})
manager.register(listener.toRegistrationDescription {
priority = PriorityConstant.LAST
isAsync = false
})

我们提供了一个新的类型 EventListernerRegistrationDescription 来承载这些 EventListener 自身不需要关心的属性。

465

更多详情参考 #465

EventResult 结构优化; 响应值支持处理 CompletableFutureDeferred (#466)

也许你可能有注意到过,EventResult.content 在默认情况下支持将非阻塞的响应式结果进行自动收集(例如 reactorrxJava),这一特性也在 EventResult.content 的文档说明上有所体现。

#466 在这之前支持的基础上,又增加支持了对 CompletableFutureDeferred 这两个异步类型的收集,同时完善了 EventResult 整体的依赖关系,使它们各自的职责更加清晰。

466

更多详情参考 #466