1

我试图了解带有发送方和接收方程序的 RabbitMQ 服务器。现在,当发送者发送一条消息并且接收者会收到相同的消息时,整个设置运行良好。

但是,当我发送两条消息(通过两次运行发送方)并运行两次接收程序时,我只收到第一条消息。

发件人

  ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();


        channel.queueDeclare(QUEUE_NAME, true, false, false, null);
        String message = "He12!";
        channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
        System.out.println("Sent "+message);
        channel.close();
        connection.close();

接收者

    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    Connection connection = factory.newConnection();
    Channel channel = connection.createChannel();

    channel.queueDeclare(QUEUE_NAME, true, false, false, null);

    QueueingConsumer consumer = new QueueingConsumer(channel);
    channel.basicConsume(QUEUE_NAME, true, consumer);
    QueueingConsumer.Delivery delivery = consumer.nextDelivery();
    /*channel.basicCancel(consumer.getConsumerTag());   */

    String message;
     if (delivery != null) {
        message = new String(delivery.getBody());
        System.out.println("Reciever .."+message);

    }

    channel.close();
    connection.close();
4

2 回答 2

1

当我用 no_Ack = false 修改接收器并调用 BasicAck 时,这个问题就解决了。感谢 @robthewolf 和 @Card(by twitter) 的帮助。

PFB 现在是修改后的接收器。

        ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    Connection connection = factory.newConnection();
    Channel channel = connection.createChannel();

    channel.queueDeclare(QUEUE_NAME, true, false, false, null);

    QueueingConsumer consumer = new QueueingConsumer(channel);
    channel.basicConsume(QUEUE_NAME, false, consumer);
    QueueingConsumer.Delivery delivery = consumer.nextDelivery(10);
    /*channel.basicCancel(consumer.getConsumerTag());   */

    String message = null;

     if (delivery != null) {
        message = new String(delivery.getBody());
        System.out.println("Reciever .."+message);
        channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
    }

    channel.close();
    connection.close();
    return message;
于 2012-07-23T07:52:38.773 回答
0

你试过没有

channel.basicCancel(consumer.getConsumerTag());

线?

此外,做这样的事情会更好:

while(true){
  QueueingConsumer.Delivery delivery = consumer.nextDelivery();
  String message;
  if (delivery != null) {
    message = new String(delivery.getBody());
    System.out.println("Reciever .."+message);
  }
}

这样您就只有一个消费者在一个循环中消费所有消息。这只是一个示例,我只是有一种方法可以干净地跳出循环,而不必使用 ctrl-c。

于 2012-07-22T11:47:11.873 回答