2015-08-01 12 views
8

koduIssue nawiązaniem połączenia z królika MQ

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

    } 

} 
} 

otrzymuję poniższy wyjątek: -

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) 

Odpowiedz

5

Wystarczy zmienić linię channel.queueDeclare(QUEUE_NAME, false, false, false, null); do channel.queueDeclare(QUEUE_NAME, true, false, false, null);

Ten pracował dla mnie.

+0

Tak, kolejka zadeklarować parametry nie mogą być zmieniane pomiędzy wywołaniami. –

+1

Komunikat o błędzie wyjaśnia tutaj problem: protokół metoda: #method (kod-odpowiedzi = 406, reply-text = PRECONDITION_FAILED - nierównomierny arg 'trwały' dla kolejka 'test' w vhost '/' : Otrzymano "false", ale bieżący jest "prawdziwy" –

9

To się dzieje od czasu sprzed istniejącego kanału na serwerze RabbitMQ, o nazwie test, został stworzony z wytrzymałego zestawu true:

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

pan od zmienił swój kod tak:

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

Musisz usunąć kanał ze swojego serwera (rabbitmqctl) lub utworzyć nowy kanał (unikalna nazwa).

Powiedziałbym, że twoja odpowiedź rozwiązała twój problem, odkąd zmieniłeś nazwę swojej kolejki, ale nie odzwierciedlałeś tego w swojej odpowiedzi.

+0

Tak, to prawda, ale tutaj jest odwrotnie, Istniejąca kolejka została ustawiona durable = true, ale później użytkownik próbował ją utworzyć jako durable = false –

+0

@JohnSmith, good call . Zaktualizowałem swoją odpowiedź. – wulfgarpro

0

zrobić raz:
1.run ty App z konsumentem trwały = true w channel.queueDeclare
niech połączyć przetwarza kolejkę
2.Zamknąć niego.
3.Start producenta

teraz nie dostaniesz ten wyjątek