简体   繁体   English

与Rabbit MQ建立连接的问题

[英]Issue in establishing connection with 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();

    }

}
}

I am getting the below exception:- 我得到以下例外: -

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)

This is happening since your pre-existing channel on your RabbitMQ server, named test , was created with durable set true : 这是因为您的RabbitMQ服务器上的预先存在的通道(名为test )是使用持久设置true创建的:

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

You've since changed your code like so: 你已经改变了你的代码:

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

You need to remove the channel from your server ( rabbitmqctl ), or create a new channel (unique name). 您需要从服务器中删除该通道( rabbitmqctl ),或创建一个新通道(唯一名称)。

I'd say your answer solved your problem since you renamed your queue, but you didn't reflect this in your answer. 我说你的答案解决了你的问题,因为你重命名了你的队列,但你没有在你的答案中反映出来。

Just change the line channel.queueDeclare(QUEUE_NAME, false, false, false, null); 只需更改行channel.queueDeclare(QUEUE_NAME, false, false, false, null); to channel.queueDeclare(QUEUE_NAME, true, false, false, null); to channel.queueDeclare(QUEUE_NAME, true, false, false, null);

This worked for me. 这对我有用。

do that once: 做一次:
1.run you app with consumer durable=true in channel.queueDeclare 1.在channel.queueDeclare中使用consumer durable = true运行app
let it connect the queue 让它连接队列
2.close it. 关闭它。
3.start the producer 3.启动制片人

now you wont get this exception 现在你不会得到这个例外

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM