我正在使用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是异步,所以在开始时它不会检索消息,但是当它检索它时,它会打印它。
答案 0 :(得分:0)
是的,通讯是异步的。
在我看来,我认为RPC
模式是合适的:
https://www.rabbitmq.com/tutorials/tutorial-six-java.html
但是如果我们需要在远程计算机上运行一个函数并等待呢? 结果呢?嗯,这是一个不同的故事。这种模式是 通常称为远程过程调用或RPC。