2016-03-28 39 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()); 
}