将侦听器变成 Java 中的未来

2024-03-02

我正在尝试将侦听器变成 Future,以进行异步连接。我还不习惯使用java futures,我对javascript Promise有一些经验,但我不知道如何用java编写它(我已经看到Java 8中的“CompletableFuture”可能会解决我的问题,不幸的是我卡住了java 7)。这是我到目前为止所做的:

public Future<Boolean> checkEmailClientConfiguration(final EmailClientConfiguration config) {
    final Future<Boolean> future = ???;
    // In some other languages I would create a deferred
    Transport transport = null;
    try {
        transport = session.getTransport("smtp");
        transport.addConnectionListener(new ConnectionListener() {
            @Override
            public void opened(ConnectionEvent connectionEvent) {
                System.out.println("!!!opened!!! ; connected=" + ((SMTPTransport) connectionEvent.getSource()).isConnected());
                // HERE I would like to make my future "resolved"
            }

            @Override
            public void disconnected(ConnectionEvent connectionEvent) {
            }

            @Override
            public void closed(ConnectionEvent connectionEvent) {
            }
        });
        transport.connect(config.getMailSMTPHost(),
                          config.getMailSMTPPort(),
                          config.getMailUsername(),
                          config.getMailPassword());
        return future;
    } catch (final MessagingException e) {
        throw e;
    } finally{
        if(transport != null){
            transport.close();
        }   
    }
}

我找不到任何简单的方法来做到这一点。到目前为止我发现的唯一解决方案是扩展 FutureTask 并在 Callable 运行结束时等待/睡眠,直到某个状态变量设置为已解决。我真的不喜欢在我的业务代码中等待/睡眠的想法,可能已经存在一些东西可以使其推迟? (在 java 中,或者 Apache commons 或 guava 等流行库中?)


终于从同事那里得到了答案。我正在寻找的内容存在于 Guava: SettableFuture 中。代码如下所示:

    final SettableFuture<Boolean> future = SettableFuture.create();
    Transport transport = null;
    try {
        transport = session.getTransport("smtp");
        transport.addConnectionListener(new ConnectionListener() {
            @Override
            public void opened(ConnectionEvent connectionEvent) {
                future.set(((SMTPTransport) connectionEvent.getSource()).isConnected());
            }

            @Override
            public void disconnected(ConnectionEvent connectionEvent) {
            }

            @Override
            public void closed(ConnectionEvent connectionEvent) {
            }
        });
        transport.connect(config.getMailSMTPHost(),
                config.getMailSMTPPort(),
                config.getMailUsername(),
                config.getMailPassword());
    } catch (final MessagingException e) {
        future.setException(e);
    } finally{
        if(transport != null){
            transport.close();
        }
    }
    return future;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将侦听器变成 Java 中的未来 的相关文章

随机推荐

  • 如何将 Ada.Real_TIme.Time 转换为字符串?

    我想写一个Ada Real Time Time http www adaic com standards 05rm html RM D 8 html在一个文件中 我怎样才能做到这一点 Thanks 您可以使用Ada Real Time Sp
  • 在 EPPLUS 中读取 xlsx (2007) 文件时出错

    我在尝试读取 Excel 文件时遇到错误 xlsx 保存在Excel 2007 using EPPlus图书馆 一些解决方法 带有 EPPlus v 的 ASP net mvc 5 应用程序4 0 4 0 用户可以从我的网站下载模板文件 然
  • CSS - 创建 9x9 数独网格的最佳方法是什么?

    我正在开展一些项目来改进我的 HTML 和 CSS 其中之一是简单的数独求解器 我需要创建一个网格来放置标签或文本框 我想要一个与此中的网格图像完全相同的网格布局question https stackoverflow com questi
  • Symfony2 更新 bootstrap.php.cache

    最近 我从 symfony com 上提供的 BETA 版本开始了 Symfony2 中的一个项目 过了一段时间 我需要升级到master分支 所以我从github上检索了最新的并将其切换到vendor symfony 但是 我的 boot
  • Firefox 在收到指定内容范围的 206 后不会请求进一步的数据

    为了提供一些背景信息 我有一个
  • 如何使用Java找到偏差

    我想使用以下代码找出两条绘图线之间的偏差 但由于某种原因 它感觉不对 import java awt import java awt event ActionEvent import java awt event ActionListene
  • 如何找到源代码的编译日期?

    是否可以存储并显示项目编译的日期 我想在程序启动时打印此日期 以便了解使用的是哪个版本 目前我都是手工做的 比较麻烦 我正在使用 Visual Studio 2010 C 指定有一个特殊的预处理器宏 称为 DATE 这是编译发生时间的字符串
  • 如何捕获 JDBC 中的特定异常?

    如何捕获特定异常JDBC http en wikipedia org wiki Java Database Connectivity 示例 主键异常或外键异常 最好的且独立于数据库的处理方式SQLException更具体地说 是确定SQL状
  • 在 jQuery 中使用 window.location.hash

    我想使用 jQuery 制作一个褪色导航菜单 其中与当前页面对应的 按下 按钮的行为与 未按下 按钮不同 具体来说 它在悬停时不会褪色为不同的颜色 如果我查看 www guitaracademy nl 上的示例 我会发现他们使用带有 win
  • WebDriverException:未知错误:Runtime.callFunctionOn 抛出异常:TypeError:JSON.stringify 不是使用 Selenium 和 ChromeDriver 的函数

    我使用 Selenium 和 Python 来生成网站上信用卡字段的输入 当你尝试时send keys到该字段它总是返回此错误 我使用不同的网络驱动程序 Chrome Edge Firefox 具有相同的效果 在字段中显示任何输入之前会弹出
  • 对函数进行条件参数调用,参数可能为空

    对于我提供的玩具示例来说 这个问题可能听起来很愚蠢 但在我面临的实际情况中实际上是有意义的 承担职能f例如 f lt function x if missing x something very nice happens if x is m
  • 最大限度地减少运输时间

    底部更新 包括解决方案源代码 我有一个具有挑战性的业务问题 计算机可以帮助解决 沿着山区 有一条蜿蜒曲折的长河 水流湍急 沿着河流的某些部分有一些环境敏感的土地 适合种植需求量很大的特定类型的稀有水果 一旦田间劳动者收获了水果 就开始将水果
  • WebDriver 通过 xPath 查找元素,如果未找到元素,则不会超时,屏幕只是挂在那里。

    我面临一些问题 由于我的测试语句无法找到该元素 测试只是挂在那里 浏览器打开并且无法继续下一个测试 我的 TestStatemet 像这样 driver findElement By xpath input name AID and con
  • 将 Gson 与接口类型结合使用

    我正在编写一些服务器代码 其中客户端以 JSON 形式发送请求 我的问题是 有许多可能的请求 所有请求在小的实现细节上都有所不同 因此我想到使用 Request 接口 定义为 public interface Request Respons
  • 变量 r 可能尚未初始化

    有一个非常简单的程序 public class A public static void main String p final Runnable r new Runnable public void run System out prin
  • 调用 Go 函数,该函数接受接口 A 的切片和结构 B 的切片(B 实现 A)

    我有以下类型 type Statement interface Say string type Quote struct quote string func p Quote Say string return p quote func Re
  • 如何实现 twitter bootstrap 手风琴?

    我正在尝试实现 Twitter Bootstrap Collapse 插件 http twitter github io bootstrap 2 3 2 javascript html collapse http twitter githu
  • 悬停时覆盖图像

    我不确定尝试在悬停时在图像上显示透明叠加层时做错了什么 最初 我尝试了一种 javascript 方法 但这不起作用 所以我想我会尝试一种更轻量级的 css 方法 有谁明白为什么这不起作用 section2 box display inli
  • 如何制作 Linux GUI?

    我的主要经验是 C C 所以我更愿意继续使用它们 我不想使用 QT GTK 或 wxWidgets 或任何工具包 我想学习本机编程 但这违背了目的 考虑到这一点 我也想避免使用 Java 我了解 gnome xfce 和 KDE 等都是 L
  • 将侦听器变成 Java 中的未来

    我正在尝试将侦听器变成 Future 以进行异步连接 我还不习惯使用java futures 我对javascript Promise有一些经验 但我不知道如何用java编写它 我已经看到Java 8中的 CompletableFuture