web-dev-qa-db-fra.com

Problème lors de l'établissement d'un lien avec Rabbit MQ

code

import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;


public class Send {
private final static String QUEUE_NAME = "test";

public static void main(String[] argv) throws Java.io.IOException {
    try {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");

        Connection connection = factory.newConnection();
        System.out.println(connection.getPort());
        System.out.println(connection.getAddress());

        Channel channel = connection.createChannel();
        System.out.println("opening channel");
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        String message = "Hello World!";
        channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
        System.out.println(" [x] Sent '" + message + "'");
        channel.close();
        connection.close();
    } catch (Exception ex) {
    ex.printStackTrace();

    }

}
}

Je reçois l'exception ci-dessous: -

1. Java.io.IOException  at
    com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.Java:106)   at
    com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.Java:102)   at
    com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.Java:124)
        at
    com.rabbitmq.client.impl.ChannelN.queueDeclare(ChannelN.Java:844)
        at com.rabbitmq.client.impl.ChannelN.queueDeclare(ChannelN.Java:61)
        at com.in.test.Send.main(Send.Java:24) Caused by:
    com.rabbitmq.client.ShutdownSignalException: channel error; protocol
    method: #method<channel.close>(reply-code=406,
    reply-text=PRECONDITION_FAILED - inequivalent arg 'durable' for
    queue 'test' in vhost '/': received 'false' but current is 'true',
    class-id=50, method-id=10)  at
    com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.Java:67)
        at
    com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValue(BlockingValueOrException.Java:33)
        at
    com.rabbitmq.client.impl.AMQChannel$BlockingRpcContinuation.getReply(AMQChannel.Java:361)
        at
    com.rabbitmq.client.impl.AMQChannel.privateRpc(AMQChannel.Java:226)
        at
    com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.Java:118)
        ... 3 more Caused by: com.rabbitmq.client.ShutdownSignalException:
    channel error; protocol method:
    #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'durable' for
    queue 'test' in vhost '/': received 'false' but current is 'true',
    class-id=50, method-id=10)  at
    com.rabbitmq.client.impl.ChannelN.asyncShutdown(ChannelN.Java:484)
        at
    com.rabbitmq.client.impl.ChannelN.processAsync(ChannelN.Java:321)
        at
    com.rabbitmq.client.impl.AMQChannel.handleCompleteInboundCommand(AMQChannel.Java:144)
        at
    com.rabbitmq.client.impl.AMQChannel.handleFrame(AMQChannel.Java:91)
        at
    com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.Java:554)
        at Java.lang.Thread.run(Thread.Java:745)
11
sougata das

Cela se produit depuis que votre canal préexistant sur votre serveur RabbitMQ, nommé test, a été créé avec le jeu durable true:

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

Vous avez depuis changé votre code comme suit:

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

Vous devez supprimer le canal de votre serveur ( rabbitmqctl ) ou créer un nouveau canal (nom unique).

Je dirais que votre réponse a résolu votre problème depuis que vous avez renommé votre file d'attente, mais vous n'en avez pas tenu compte dans votre réponse.

13
wulfgarpro

Il suffit de changer la ligne channel.queueDeclare(QUEUE_NAME, false, false, false, null);to channel.queueDeclare(QUEUE_NAME, true, false, false, null);

Cela a fonctionné pour moi.

5
sougata das

fais ça une fois:
1.exécutez votre application avec consommateur durable = true dans channel.queueDeclare
laissez-le connecter la file d'attente
2.fermer.
3.démarrer le producteur 

maintenant vous n'obtiendrez pas cette exception

0
Eliko