Closed axiangcoding closed 1 year ago
目前已基本确认是由于 核心模块 中全局的异步调度器中的缺陷导致当 xxxAsync
抛出异常时导致调度作用域被错误关闭而导致的,会在核心版本 v3.2.0
中修复,不影响组件。
Note: 如果希望临时解决,则可直接将异步函数
xxxAsync
更替为阻塞函数xxxBlocking
。
kook回复功能无效,未出现报错
但是关于 "未出现报错" 实际上是对 async
函数的错误应用。xxxAsync
函数返回的均为 CompletableFuture
类型结果,需要使用 .exceptionally
、.whenComplete
等方式来感知到结果的异常,否则它们将会被“遗弃”。
一个最简单的例子:
// 直接创建一个立刻抛出异常的future
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
throw new RuntimeException();
});
// 不管怎么等待,你也不会得到这个异常的任何信息
Thread.sleep(50);
// 通过 whenComplete 得知异常
future.whenComplete((value, ex) -> {
System.out.println("得到异常: " + ex);
});
// 或通过 exceptionally 处理异常
future.exceptionally(e -> {
System.out.println("处理异常: " + e);
return "ex value";
}).thenAccept(value -> {
System.out.println("结果: " + value);
});
Warning
- 不建议使用
CompletableFuture
的get
、join
等会造成阻塞的API,这样还不如使用xxxBlocking
API 。- 如果使用异步函数,建议全局均使用异步函数且函数返回值也使用
CompletableFuture
,参见文档 事件监听:异步性与返回值
版本号
v3.1.0
附加版本
涉及的编程语言
Java
项目构建工具
Gradle
涉及的组件库
KOOK, QQ频道
问题描述
复现方式
相关日志
其他补充
有收到频道消息,但是调用的方法event.replyAsync()失效