2016-03-28 23 views
1

我使用EventBus發送一個信息,我想要得到的回覆消息到一個變量,然後將返回it.this是代碼塊。未來在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; 

} 
} 

其實這是一些次工作fine.But雖然從未塊平均exit.Its future.result()沒有得到值,即使是回覆消息後received.I不知道這個正確的方法而且我對於期貨在vert.x中的工作方式並不清楚。是否還有其他方法來實現這種情況。

+0

一個習語用法未來的'<> ''將有'sendMessage'返回'未來'並立即返回,而不是阻止...這是一個選項嗎? – tariksbl

回答

1

我建議你閱讀有關Vertx同步項目 - 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()); 
}