gpt4 book ai didi

java - 在 Java 中将监听器变成 future

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:13:15 25 4
gpt4 key购买 nike

我正在尝试将一个监听器变成一个 Future,用于异步连接。我还不习惯使用 java futures,我对 javascript promises 有一些经验,但我不知道如何用 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 运行结束时等待/hibernate 直到某个状态变量设置为已解决。我真的不喜欢在我的业务代码中等待/hibernate 的想法,可能已经存在一些东西可以让它推迟? (在 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;

关于java - 在 Java 中将监听器变成 future ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26649918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com