Rabbitmq错误CachingConnectionFactory:1302-通道关闭:通道错误;

Rabbitmq错误CachingConnectionFactory:1302-通道关闭:通道错误;,rabbitmq,spring-amqp,spring-cloud-stream,Rabbitmq,Spring Amqp,Spring Cloud Stream,我得到了这个错误 错误CachingConnectionFactory:1302-通道关闭:通道错误;协议方法:#方法(回复代码=406,回复文本=Premission_失败-vhost'qa40'中队列'xyz.xyz.dlq'的不等价参数'x-message-ttl':收到'signedint'类型的值'10000',但当前值为none,类id=50,方法id=10) 我的配置文件中包含以下内容 spring.cloud.stream.bindings.xyz.destination=xyz

我得到了这个错误

错误CachingConnectionFactory:1302-通道关闭:通道错误;协议方法:#方法(回复代码=406,回复文本=Premission_失败-vhost'qa40'中队列'xyz.xyz.dlq'的不等价参数'x-message-ttl':收到'signedint'类型的值'10000',但当前值为none,类id=50,方法id=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());
    }
}
公共类xyzDlqConsumer扩展了重路由dLqMessages{
私有最终静态字符串队列_NAME=xyz.xyz_组;
私有最终静态字符串DLQ=QUEUE_NAME+“.DLQ”;
公共字符串getOriginalQueue(){
返回队列名称;
}
@RabbitListener(队列=DLQ)
私有无效调用重新发布(消息失败消息){
重新发布(失败消息);
}
}
公共抽象类重新路由DlqMessages{
私有静态最终字符串X_RETRIES_HEADER=“X-RETRIES”;
专用静态最终字符串延迟\u EXCHANGE=“dlqReRouter”;
@值(${RETRIES\u COUNT}”)。//3
私有整数检索器;
@值(“${DELAY\u TIME}”)//10000
私有整数消息延迟;
@自动连线
私人兔样板兔样板;
受保护的抽象字符串getOriginalQueue();
公共无效重新发布(消息失败消息){
映射头=failedMessage.getMessageProperties().getHeaders();
Integer retriesHeader=(整数)头.get(X\u RETRIES\u头);
if(retriesHeader==null){
retriesHeader=Integer.valueOf(0);
}
if(检索器<检索器){
headers.put(X_RETRIES_HEADER,retriesHeader+1);
headers.put(“x-delay”,messageDelay*retriesHeader);
this.rabbitTemplate.send(延迟交换,getOriginalQueue(),failedMessage);
}否则{
//三次尝试后,你想做什么就做什么
}
}
@豆子
公共DirectExchange delayExchange(){
DirectExchange=新的DirectExchange(延迟交换);
exchange.setDelayed(true);
换汇;
}
@豆子
公共绑定bindOriginalToDelay(){
将BindingBuilder.bind(新队列(getOriginalQueue()).to(delayExchange()).with(getOriginalQueue());
}
}

错误消息说明了一切

vhost“qa40”中队列“xyz.xyz.dlq”的参数“x-message-ttl”不等效:接收到类型为“signedint”的值“10000”,但当前为无,类id=50,方法id=10)

队列是不变的;在创建它们之后,不能更改它们的属性

您正试图声明一个ttl设置为10000的队列,而一个已存在且该名称没有ttl
的队列当前为none

你不能那样做;如果要添加ttl,必须删除并重新创建队列