1

送信者プログラムと受信者プログラムを使用して、RabbitMQ サーバーを理解しようとしています。これで、送信者が単一のメッセージを送信し、受信者が同じメッセージを受信する場合、セットアップ全体がうまく機能します。

ただし、(送信者を 2 回実行して) 2 つのメッセージを送信し、受信者プログラムを 2 回実行すると、最初のメッセージのみが取得されます。

送信者

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

ループ内のすべてのメッセージを消費するコンシューマーが 1 つだけになるようにします。これは、ctrl-c を使用するのではなく、きれいにループから抜け出す方法を私が持っている例にすぎません。

于 2012-07-22T11:47:11.873 に答える