RabbitMQ中的发送方和接收方对

RabbitMQ中的发送方和接收方对,rabbitmq,Rabbitmq,我试图理解带有发送方和接收方程序的RabbitMQ服务器。现在,当发送方发送一条消息,接收方接收到该消息时,整个设置工作正常 但是,当我发送两条消息(通过运行sender两次)并运行receiver程序两次时,我只收到第一条消息 寄件人 ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factor

我试图理解带有发送方和接收方程序的RabbitMQ服务器。现在,当发送方发送一条消息,接收方接收到该消息时,整个设置工作正常

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

寄件人

  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();

你试过了吗

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键。

您在没有

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键。

当我修改接收器时,没有确认=false并调用BasicAck,问题就解决了。感谢@robthewolf和@Card(推特)的帮助

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;

当我修改了接收器,没有确认=false,并且调用BasicAck时,这个问题就为我解决了。感谢@robthewolf和@Card(推特)的帮助

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;

谢谢你的回复。。我曾经尝试过不使用basicCancel(编辑了相同的代码),但问题仍然是一样的。我还认为,在不使用while循环的情况下,可以将其公开为一个web服务,一次发送一条消息。每个请求跨一个使用者是一个坏主意吗?通过在调试模式下执行接收器并在RabitMq服务器中运行几个命令,我发现在执行basicConsume函数调用后不久,队列大小变为零(命令rabbitmqctl list_queues)@praveena_kd执行消费者之前的队列大小是多少?@praveena_kd我不完全理解让消费者只读取和处理一条消息的目的是什么。我计划在servlet中编写此接收器代码,以便每次可以用一条消息响应对该servlet的web请求。执行使用者之前的队列大小等于发送到该队列的消息数。感谢您的回复。。我曾经尝试过不使用basicCancel(编辑了相同的代码),但问题仍然是一样的。我还认为,在不使用while循环的情况下,可以将其公开为一个web服务,一次发送一条消息。每个请求跨一个使用者是一个坏主意吗?通过在调试模式下执行接收器并在RabitMq服务器中运行几个命令,我发现在执行basicConsume函数调用后不久,队列大小变为零(命令rabbitmqctl list_queues)@praveena_kd执行消费者之前的队列大小是多少?@praveena_kd我不完全理解让消费者只读取和处理一条消息的目的是什么。我计划在servlet中编写此接收器代码,以便每次可以用一条消息响应对该servlet的web请求。执行使用者之前的队列大小等于发送到该队列的消息数。