RabbitMQ如何从java消费者

时间:2016-04-10 10:00:40

标签: java asynchronous rabbitmq

我正在使用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是异步,所以在开始时它不会检索消息,但是当它检索它时,它会打印它。

1 个答案:

答案 0 :(得分:0)

是的,通讯是异步的。

在我看来,我认为RPC模式是合适的:

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

  

但是如果我们需要在远程计算机上运行一个函数并等待呢?   结果呢?嗯,这是一个不同的故事。这种模式是   通常称为远程过程调用或RPC。