Первое сообщение в очередь RabbitMQ вызывает отключение канала - PullRequest
0 голосов
/ 23 мая 2018

Первое сообщение в мою очередь всегда терпит неудачу.Со второго, все работает просто отлично!

Stacktrace

Не уверен, что это читается так:

Created new connection: rabbitConnectionFactory#1b940034:0/SimpleConnection@2c52fbff [delegate=amqp://guest@10.0.0.10:5672/, localPort= 36370]

Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'auto_delete' for exchange 'rabbitmq_exchange' in vhost '/': received 'false' but current is 'true', class-id=40, method-id=10)

Я не уверен, почему это происходит, потому что я запускаю его на новой виртуальной машине (экземпляр AWS EC2) каждый раз.Как «текущий может быть правдой»?

Я полагаю, что что-то неправильно настроено в издателе Spring Boot:

enter image description here

Не уверен, еслиэто читается так:

@Configuration
public class RabbitMqConfig {
    @Bean
    Queue queue() {
        return new Queue(System.getenv("RABBITMQ_QUEUE_NAME"), true,false, false);
    }

    @Bean
    DirectExchange exchange() {
        return new DirectExchange(System.getenv("RABBITMQ_EXCHANGE_NAME"), true, false);
    }

    @Bean
    Binding binding(Queue queue, DirectExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with(System.getenv("RABBITMQ_ROUTING_KEY"));
    }

    @Bean
    public MessageConverter jsonMessageConverter(){
        return new Jackson2JsonMessageConverter();
    }

    public AmqpTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
        final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setMessageConverter(jsonMessageConverter());
        return rabbitTemplate;
    }
}

Так что здесь не так?Спасибо!

1 Ответ

0 голосов
/ 23 мая 2018

Ошибка вполне понятна ...

Отключение канала: ошибка канала;Метод протокола: #method (reply-code = 406, reply-text = PRECONDITION_FAILED - неэквивалентный аргумент 'auto_delete' для обмена rabbitmq_exchange 'в vhost' / ': получено' false ', но текущий равен' true ', class-id = 40, method-id = 10)

При первом открытии соединения среда ищет очереди / привязки и т. д. и объявляет их.Если очередь уже существует, она должна иметь те же свойства / аргументы.

@Bean
Queue queue() {
    return new Queue(System.getenv("RABBITMQ_QUEUE_NAME"), true, false, false);
}

Предположительно, на стороне потребителя она объявляется с другими свойствами ...

@Bean
Queue queue() {
    return new Queue(System.getenv("RABBITMQ_QUEUE_NAME"), true, false, true);
}

(auto_delete неэквивалентен).

Они должны быть одинаковыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...