Rabbitmq ERROR CachingConnectionFactory:1302 - 通道关闭:通道错误;
Rabbitmq ERROR CachingConnectionFactory:1302 - Channel shutdown: channel error;
我遇到了这个错误
错误CachingConnectionFactory:1302 - 频道关闭:频道错误;协议方法:#method(reply-code=406, reply-text=PRECONDITION_FAILED - vhost 'qa40' 中的队列 'xyz.xyz.dlq' 的不等价 arg 'x-message-ttl': 收到值 '10000'类型 'signedint' 但当前是 none, class-id=50, method-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());
}
}
错误消息说明了一切;
inequivalent arg 'x-message-ttl' for queue 'xyz.xyz.dlq' in vhost 'qa40': received the value '10000' of type 'signedint' but current is none, class-id=50, method-id=10)
队列是不可变的;创建后不能更改它们的属性。
您正在尝试声明一个 ttl 设置为 10000 的队列,而没有 ttl 的同名队列已经存在 current is none
。
你不能那样做;如果要添加 ttl,则必须删除并重新创建队列。
我遇到了这个错误
错误CachingConnectionFactory:1302 - 频道关闭:频道错误;协议方法:#method(reply-code=406, reply-text=PRECONDITION_FAILED - vhost 'qa40' 中的队列 'xyz.xyz.dlq' 的不等价 arg 'x-message-ttl': 收到值 '10000'类型 'signedint' 但当前是 none, class-id=50, method-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());
}
}
错误消息说明了一切;
inequivalent arg 'x-message-ttl' for queue 'xyz.xyz.dlq' in vhost 'qa40': received the value '10000' of type 'signedint' but current is none, class-id=50, method-id=10)
队列是不可变的;创建后不能更改它们的属性。
您正在尝试声明一个 ttl 设置为 10000 的队列,而没有 ttl 的同名队列已经存在 current is none
。
你不能那样做;如果要添加 ttl,则必须删除并重新创建队列。