ListenableFuture 链可以处理内部 ExecutionException 吗?

2024-01-25

我提供了一个 api (fnGrpc)执行 gRPC 调用并返回ListenableFuture解析为某个值v(其实现是固定且不可修改的)。

我想提供一个辅助函数(fnHelper) that:

  1. 对 gRPC 结果进行一些转换处理,并返回一个ListenableFuture解析为转换后的值t1.

  2. 处理 gRPC 调用的失败,并返回一些其他值t2而不是有fnHelper的呼叫者看到ExecutionException.

我可以使用以下方法解决(1)Futures.transform():

package myHelper;

ListenableFuture<T> fnHelper() {
  return Futures.transform(fnGrpc(), new Function<V, T>() {
    @Override
    public T apply(V v) {
      T t1 = f(v);
      return t1;
    }
  });
} 

和来电者:

package myApp;

// ...

try {
  T t = fnHelper().get();
} catch (ExecutionException | InterruptedException ex) {
  // ...
}

我怎样才能实现(2),同时仍然享受乐趣 Helper return aListenableFuture并保持非阻塞?

我本可以有fnHelper它本身创建了一个额外的线程,我将在其中调用.get() on fnGrpc,但是还有另一种方法可以避免这个额外的线程吗?


我不是番石榴专家,但似乎你可以使用相同的方法来做到这一点Futures http://google.github.io/guava/releases/23.0/api/docs/com/google/common/util/concurrent/Futures.html实用程序类,特别是方法catchingAsync http://google.github.io/guava/releases/23.0/api/docs/com/google/common/util/concurrent/Futures.html#catchingAsync-com.google.common.util.concurrent.ListenableFuture-java.lang.Class-com.google.common.util.concurrent.AsyncFunction-java.util.concurrent.Executor-,您可以在其中传递返回一个的函数ListenableFuture与后备值(t2):

ListenableFuture<Integer> faultTolerantFuture = Futures.catchingAsync(originalFuture,
                       Exception.class, x -> immediateFuture(t2), executor);

然后你应该能够将其与transform方法,它进行转换:

ListenableFuture<T> fnHelper() {
    return Futures.catching(Futures.transform(fnGrpc(), new Function<V, T>() {
        @Override
        public T apply(V v) {
            T t1 = f(v);
            return t1;
        }
    }),
    Exception.class, x -> immediateFuture(t2));
}

Note:在最后一个片段中,我使用了catching代替catchingAsync为了与您问题中的代码保持一致,并且我没有指定执行者。您可能需要将这些方法与Async非阻塞处理的后缀。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ListenableFuture 链可以处理内部 ExecutionException 吗? 的相关文章

随机推荐

  • Unix 上的递归 mkdir() 系统调用

    阅读具有该名称的 Unix 系统调用的 mkdir 2 手册页后 该调用似乎不会在路径中创建中间目录 而只会在路径中创建最后一个目录 有没有什么方法 或其他函数 可以创建路径中的所有目录 而无需手动解析我的目录字符串并单独创建每个目录 不幸
  • powershell远程处理:非常慢

    如果我从solaris服务器ssh到美国服务器 ssh连接速度非常快 比如删除一个文件很快就能完成 但是为什么powershell远程处理这么慢 我进入远程会话后 然后删除一个项目 需要10多秒才能完成 Enter PSSession co
  • 带有存储枚举的条件枚举开关

    我希望这段代码能够工作 我有一个枚举 其中 Direction Right 的情况采用距离参数 enum Direction case Up case Down case Left case Right distance Int 现在另一个
  • Angular 中 ViewEncapsulation.None 的禁用效果

    如何禁用ViewEncapsulation None的效果 例如 我的一个组件 firstComponent 定义了一个带有一些属性的CSS类 第二个组件使用相同的 css 类 我希望我的 secondComponent 对第一个组件样式表
  • 使用发布/订阅时交互按钮无法正常工作

    我正在用 C 编写一个使用 pub sub 的环聊聊天机器人 这样我就可以在防火墙的一侧托管该机器人 除了卡片内的交互式按钮之外 一切似乎都运行良好 如果我创建具有特定操作方法名称的按钮 机器人会收到具有适当操作方法名称的 CARD CLI
  • 如何打开本地文件系统(Cordova)中的PDF文件?

    我一直在查看这些条目 Link 1 https stackoverflow com questions 16795172 phonegap inappbrowser display pdf 2 7 0 Link 2 https stacko
  • 使用 jdbc 连接访问在 MSSQL 服务器中的 dbo 中创建的表

    我使用以下代码通过java连接MSSQL服务器 Connection conn DriverManager getConnection jdbc sqlserver localhost 1433 DATABASENAME instanceN
  • Objective C 带有 case/switch 的全局常量

    有没有办法在 Objective C 中使用在 case switch 语句中工作的全局 int 常量 这里的技术 http stackoverflow com questions 538996 constants in objective
  • Docker 中的 RabbitMQ - 用户创建未持久

    我遇到了一个问题 用户user1未保留在我使用以下 Dockerfile 创建的容器中 这是什么原因呢 这是 RabbitMQ 的特定问题吗 例如我必须明确指定必须保留用户 FROM dockerfile rabbitmq Define m
  • Keras:改变学习率

    我试图change我的模型在使用不同的学习率进行训练后的学习率 I read here https github com keras team keras issues 888 here https github com keras tea
  • Python脚本计算目录中所有文件的行数

    所以我是 python 新手 我正在尝试编写一个脚本 该脚本迭代目录中的所有 txt 文件 计算每个文件中的行数 空白或注释掉的行除外 然后写入最终输出为 csv 最终输出应如下所示 agprices avi adp 132 5 8 我在将
  • 如何使用bootstrap嵌入谷歌地图?

    我想将地图添加到我的联系页面的 地图和方向 中 我正在逐步尝试谷歌地图嵌入程序 但它不起作用 因为我无法查看地图 我正在使用引导程序 这是我的标记
  • 如何使用 sharex 和 sharey 结合aspect=equal 和 adjustment='box-forced' 在 matplotlib 中创建具有相同比例的子图?

    我正在尝试创建四个子图 其轴代表不同方向上的不同距离范围 km 但右下子图的 x 轴表示计数 所有子图中的所有距离轴应具有相同的比例 此外 顶部的两个子图应共享其 y 轴 左侧的两个子图应共享其 x 轴 按照此issue https git
  • Laravel 多个嵌套视图

    我正在使用 laravel 布局 并且有这样的设置 控制器 public function action index this gt layout gt nest submodule partials stuff this gt layou
  • c++:模板声明中 is_member_function_pointer 的语法

    我有一个带有类似声明的模板 template
  • numpy.cross() 性能不佳

    我一直在进行一些性能测试 以提高我正在编写的宠物项目的性能 这是一个数字运算密集型应用程序 因此我一直在使用 Numpy 作为提高计算性能的一种方式 然而 接下来的性能测试结果却相当令人惊讶 测试源代码 更新了提升和批量提交的测试用例 im
  • Android 上的 Apache cordova 滚动条在哪里?

    我尝试使用 cordova 构建一个针对 android 的简单应用程序 我只是想要一个可滚动的 div 但是 如果内容小于 div 的高度 则滚动条始终可见 如果内容大于 div 的高度 即使我滚动 滚动条也永远不会出现 滚动是可能的 但
  • 如何在 Grails 中创建与 Oracle 一起使用的文件上传?

    遇到以下问题 我尝试在 grails 中创建一个简单的文件上传功能 我刚刚创建了一个域类 byte rawFile 作为财产 Grails 为我完成了剩下的大部分工作 它对于开发环境中的标准 hsqldb 运行良好 然后我将其部署到配置了
  • 为什么 SQLite CTE JOIN 中的 RANDOM() 的行为与其他 RDBMS 不同?

    RANDOM 公共表表达式 CTE 连接中的值的行为不符合预期SQLite http sqlfiddle com 5 71568 18 SQL WITH tbl1 n AS SELECT 1 UNION ALL SELECT 2 tbl2
  • ListenableFuture 链可以处理内部 ExecutionException 吗?

    我提供了一个 api fnGrpc 执行 gRPC 调用并返回ListenableFuture解析为某个值v 其实现是固定且不可修改的 我想提供一个辅助函数 fnHelper that 对 gRPC 结果进行一些转换处理 并返回一个List