繁体   English   中英

RabbitMQ如何从Java使用者返回消息

[英]RabbitMQ how to return message from java consumer

我正在使用RabbitMQ和Java。 我有一个executeLogin()方法,该方法在队列上发送一条消息,然后在另一个队列上等待答复:如果返回的消息在isSuccess字段中包含true,则需要将true返回给executeLogin()方法的调用者,如果isSuccess为false,我需要返回false(未记录)。 我这样尝试:

boolean logged = false; 
Consumer consumer = new DefaultConsumer(channel) {
    @Override
    public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
        String message = new String(body, "UTF-8");
        LoginConfirmation confirm = gson.fromJson(message, LoginConfirmation.class);
        channel.queueDelete(reply_to);
        System.out.println(" [x] Received '" + message + "'");
        LOGGER.log(Level.FINE, gson.toJson(confirm));
        logged = confirm.isSuccess();
    }
};
channel.basicConsume(reply_to, true, consumer);

或者这样:

GetResponse response = channel.basicGet(reply_to, false);
if(response == null){
    System.out.println("No message");
}else{
    byte[] body = response.getBody();
    String msg = new String(body, "UTF-8");
    System.out.println(msg);
}

但是,无论哪种方式,我都无法解决我的问题:第一种方式,它返回false,但是会打印消息(带有“ isSuccess”:true)。 第二种方式,它显示“无消息”。

我认为问题在于basicConsume和defaultConsumer是异步的 ,因此在开始时它不会检索消息,但是在检索消息时会打印它。

是的,通讯是异步的。

我认为,就您而言, RPC模式是合适的:

https://www.rabbitmq.com/tutorials/tutorial-six-java.html

但是,如果我们需要在远程计算机上运行功能并等待结果怎么办? 好吧,那是一个不同的故事。 此模式通常称为远程过程调用或RPC。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM