Próbuję zmienić słuchacza w przyszłość, na asynchroniczne połączenie. Nie jestem jeszcze przyzwyczajony do używania java futures, mam pewne doświadczenie z obietnicami javascript, ale nie widzę jak napisać to w Javie (widziałem "CompletableFuture" w Javie 8 może rozwiązać mój problem, niestety jestem utknęły w java 7). Oto, co zrobiłem do tej pory:Przekształcanie słuchacza w przyszłość w java
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();
}
}
}
Nie mogę znaleźć łatwego sposobu na zrobienie tego. Jedyne rozwiązanie, które znalazłem do tej pory, to rozszerzenie FutureTask i zakończenie biegu Callable, oczekiwanie/uśpienie, aż jakaś zmienna stanu zostanie ustawiona jako rozwiązana. Nie podoba mi się pomysł oczekiwania/spania w moim kodeksie biznesowym, jest prawdopodobnie coś, co już istnieje, aby go odłożyć na później? (w java lub popularnych bibliotekach takich jak Apache commons czy guava?)
Czy możesz opracować, co chcesz osiągnąć? –