java - 什么是Java中与异步API接口的良好设计模式
问题描述
我需要在 Java 中链接一系列专有的异步 API 调用。
我把一些有用的东西放在一起(至少在一个愉快的情况下),但想不出更好的方法来组织这段代码。我想知道是否有设计模式或库可以将丑陋包装在一组漂亮的 API 或库中。类似于 , js 承诺或 c++ 中的异步。谢谢 !!
这是我目前所做的:
// call API1
api.send(...., new myMethodCallbackHandler()));
while (myAtomicFlag.get() == 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (myAtomicFlag.get() == 1){
// success
successFlag = true;
myAtomicFlag.set(0);
.. do more success stuff
// call API2
}else{
successFlag = false;
// handle problems
}
}
解决方案
目前,Java 不支持 async/await,但 Kotlin 支持,因此您可以使用 Kotlin 编写这段代码,而您的程序的其余部分可以保留在 Java 中。
然而,Java 有一个 js 承诺的等价物:CompletableFuture。它可以通过以下方式用于您的任务:
for (API api: apilist) {
MyMethodCallbackHandler handler = new MyMethodCallbackHandler();
api.send(...., handler);
try {
Object result = handler.get();
.. do more success stuff
} catch (Throwable ex) {
// handle problems
}
}
我假设回调处理程序必须实现以下接口:
interface CallbackHandler {
void onSuccess(Object result);
void onError(Throwable error);
}
那么类MyMethodCallbackHandler
可以声明为:
class MyMethodCallbackHandler extends CompletableFuture implements CallbackHandler {
void onSuccess(Object result) {
super.complete(result);
}
void onError(Throwable error) {
super.completeExceptionally(error);
}
}
推荐阅读
- c# - IDataRecord 读取器在调用 Linq.First() 时被关闭
- vb.net - 用 RichTextBox 中的 String 中的分号替换新行 - vb.net
- ruby-on-rails - 导轨。请求的资源上不存在“Access-Control-Allow-Origin”标头
- elasticsearch - Elasticsearch 5.5 - 如何从 _stats 返回 _all.total.store.size_in_bytes ?
- php - 将 Doctrine 注入测试 - Symfony 4.1
- c# - 在一个文本框中选择多行Gridview C#
- angular - 角度 6 更新后:加载资源失败:服务器响应状态为 404 ()
- angular - 使用 ECharts 服务和 Karma 测试
- javascript - 使用谷歌表格和脚本发送电子邮件
- python - 分段错误:11 - 运行包装在 python 中的 fortran