【问题标题】:RabbitMQ how to return message from java consumerRabbitMQ如何从java消费者返回消息
【发布时间】:2016-04-10 21:30:09
【问题描述】:

我正在使用 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)。第二种方式,打印“no message”。

我认为问题是basicConsume和defaultConsumer是异步的,所以一开始它不会检索消息,但是当它检索到它时,它会打印它。

【问题讨论】:

    标签: java asynchronous rabbitmq


    【解决方案1】:

    是的,通信是异步的。

    在你的情况下,我认为RPC 模式是合适的:

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

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

    【讨论】:

    • 是的,谢谢,但问题是我还没有实现服务器组件,只有客户端。我发送一条消息,然后我必须在队列中等待一条消息,并使用定义的routing_key,分析该消息并将某些内容返回给调用者。这可能吗?
    猜你喜欢
    • 1970-01-01
    • 2020-04-20
    • 2016-05-04
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    相关资源
    最近更新 更多