Rabbitmq,从客户端接收消息

时间:2017-07-04 09:19:09

标签: java rabbitmq

我有一个简单的生产者和接收者类来处理rabbitmq

制片人:

public static void main(String[] argv) throws Exception {
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    Connection connection = factory.newConnection();
    Channel channel = connection.createChannel();

    channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT);
    String queueName = channel.queueDeclare().getQueue();
    channel.queueBind(queueName, EXCHANGE_NAME, "");

    System.out.println(" [*] Waiting for messages. To exit press CTRL+C");

    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");
        System.out.println(" [x] Received '" + message + "'");
      }
    };
    channel.basicConsume(queueName, true, consumer);
  }

接收者:

 channel.sendAndReceiveMessage(EXCHANGE_NAME, "", null, message.getBytes("UTF-8"));
        System.out.println(" [x] Sent '" + message + "'");

问题是,生产者是否有可能知道接收者是否接受了消息。例如:

Observable.Transformer<T, T>

1 个答案:

答案 0 :(得分:0)

简短的回答:您没有直接的方法让制作人知道消费者已经回复了该消息 长一: 您要在此处发送的第二个参数: channel.basicConsume(queueName,true,consumer); 是auto-ack,将其设置为false会强制你执行channel.basicAck(deliveryTag,false);确认收到消息(你可以从信封中获取交付标签)或Channel.basicNack告诉你输入的内容 这是什么意思?这意味着如果你不回复消息,它将返回队列并等待再次消耗,这样,你就可以确保消费所有消息。