2016-03-28 9 views
1

私はEventBusを使用してメッセージを送信しています。返信メッセージを変数に取り込み、それを返します。これがコードブロックです。ブロック決してexit.Itsはfuture.resultを(平均しながら Vert.xでの将来の仕組みは?

public class MessageExecute { 

private static final Logger logger = LoggerFactory.getLogger(MessageExecute.class); 

public static <T> T sendMessage(Vertx vertx,String address,T message){ 

    Future<Message<T>> future = Future.future(); 

    vertx.eventBus().send(address, message, future.completer()); 

    future.setHandler(new Handler<AsyncResult<Message<T>>>() { 

     @Override 
     public void handle(AsyncResult<Message<T>> event) { 
      logger.info("received reply message | thread - " + Thread.currentThread().getName()); 
     } 

    }); 
    boolean notFound = true; 
    while(notFound){ 
     try{ 
      if(future.result()!= null){ 
       notFound = false; 
      } 
     }catch(Exception e){ 

     } 
    } 


    return message; 

} 
} 

は、実はこれはreceived.Iは、この正しい方法を知らないされても、応答メッセージの後、値を得ていない)、いくつかの回をfine.But取り組んでいますFuturesがVert.xでどのように機能しているかについては明確な考えがありません。これらのシナリオを実装するための他の方法はありません。

+0

'フューチャー<の慣用的な使用を> 'sendMessage'が' Future 'を返し、ブロッキングの代わりにすぐに戻ります。これはオプションですか? – tariksbl

答えて

1

私はVERTX-Syncのプロジェクトについて読んすることをお勧めいたします - http://vertx.io/docs/vertx-sync/java/例で

、あなたの場合に非常によく似て見える従う例があります。

EventBus eb = vertx.eventBus(); 
HandlerReceiverAdaptor<Message<String>> adaptor = streamAdaptor(); 
eb.<String>consumer("some-address").handler(adaptor); 
// Receive 10 messages from the consumer: 
for (int i = 0; i < 10; i++) { 
    Message<String> received1 = adaptor.receive(); 
    System.out.println("got message: " + received1.body()); 
}