2014-10-30 12 views
5

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?)

+0

Czy możesz opracować, co chcesz osiągnąć? –

Odpowiedz

5

W końcu dostałem odpowiedź od kolegi. To, czego szukam, istnieje w Guava: SettableFuture. Oto jak wygląda kod:

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; 
Powiązane problemy