future如何在vert.x中工作?

7z5jn7bk  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(438)

我使用eventbus发送一条消息,我想将回复消息放入一个变量中,然后返回它。这是代码块。

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;

 }
}

实际上,这是正常的。但有时while block永远不会退出。它的意思是future.result()没有得到值,即使在收到回复消息之后。我不知道这是正确的方法,我也不清楚futures在vert.x中是如何工作的。有没有其他方法来实现这种情况。

x4shl7ld

x4shl7ld1#

我建议您阅读有关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());
}

相关问题