Rabbitmq ОШИБКА CachingConnectionFactory: 1302 - Отключение канала: ошибка канала; - PullRequest
0 голосов
/ 26 января 2019

Я получаю эту ошибку

ОШИБКА CachingConnectionFactory: 1302 - Отключение канала: ошибка канала;Метод протокола: #method (reply-code = 406, reply-text = PRECONDITION_FAILED - неэквивалентный аргумент 'x-message-ttl' для очереди 'xyz.xyz.dlq' в vhost 'qa40': получено значение '10000' типа'signatureint', но текущее значение отсутствует, идентификатор класса = 50, идентификатор метода = 10)

Где мой конфигурационный файл имеет это

spring.cloud.stream.bindings.xyz.destination=xyz
spring.cloud.stream.bindings.xyz.group=xyz_group
spring.cloud.stream.bindings.xyz.consumer.max-attempts=1
spring.cloud.stream.rabbit.bindings.xyz.consumer.republish-to-dlq=true
spring.cloud.stream.rabbit.bindings.xyz.consumer.requeue-rejected=false
spring.cloud.stream.rabbit.bindings.xyz.consumer.auto-bind-dlq=true
spring.cloud.stream.rabbit.bindings.xyz.consumer.dlq-ttl=10000
spring.cloud.stream.rabbit.bindings.xyz.consumer.dlq-dead-letter-exchange=

Я использую обмен задержкой, т.е.

public class xyzDlqConsumer extends RerouteDLQMessages {

    private final static String QUEUE_NAME = xyz.xyz_group;
    private final static String DLQ = QUEUE_NAME + ".dlq";

    public String getOriginalQueue() {
        return QUEUE_NAME;
    }

    @RabbitListener(queues = DLQ)
    private void callRepublish(Message failedMessage) {
        rePublish(failedMessage);
    }
}

public abstract class RerouteDLQMessages {

    private static final String X_RETRIES_HEADER = "x-retries";
    private static final String DELAY_EXCHANGE = "dlqReRouter";
    @Value("${RETRIES_COUNT}") . //3
    private Integer retriesCount;
    @Value("${DELAY_TIME}") //10000
    private Integer messageDelay;
    @Autowired
    private RabbitTemplate rabbitTemplate;


    protected abstract String getOriginalQueue();

    public void rePublish(Message failedMessage) {

        Map<String, Object> headers = failedMessage.getMessageProperties().getHeaders();
        Integer retriesHeader = (Integer) headers.get(X_RETRIES_HEADER);
        if (retriesHeader == null) {
            retriesHeader = Integer.valueOf(0);
        }

        if (retriesHeader < retriesCount) {
            headers.put(X_RETRIES_HEADER, retriesHeader + 1);
            headers.put("x-delay", messageDelay * retriesHeader);
            this.rabbitTemplate.send(DELAY_EXCHANGE, getOriginalQueue(), failedMessage);
        } else {

            //do whatever you want after three attempts
        }
    }

    @Bean
    public DirectExchange delayExchange() {
        DirectExchange exchange = new DirectExchange(DELAY_EXCHANGE);
        exchange.setDelayed(true);
        return exchange;
    }

    @Bean
    public Binding bindOriginalToDelay() {
        return BindingBuilder.bind(new Queue(getOriginalQueue())).to(delayExchange()).with(getOriginalQueue());
    }
}

1 Ответ

0 голосов
/ 26 января 2019

В сообщении об ошибке сказано все;

неэквивалентный arg 'x-message-ttl' для очереди 'xyz.xyz.dlq' в vhost 'qa40': получено значение '10000' типа 'signatureint', но текущее значение отсутствует, идентификатор класса = 50, метод -id = 10)

Очереди неизменны; вы не можете изменить их свойства после их создания.

Вы пытаетесь объявить очередь с ttl, установленным на 10000, тогда как очередь с таким именем уже существует без ttl current is none.

Вы не можете этого сделать; Вы должны удалить и заново создать очередь, если хотите добавить ttl.

...