融會貫通
以下配置建立一個名為myDestination的交換器,佇列myDestination.consumerGroup繫結到一個主題交換器,路由鍵為萬用字元#
---
spring.cloud.stream.bindings.input.destination=myDestination
spring.cloud.stream.bindings.input.group=consumerGroup
#disable binder retries
spring.cloud.stream.bindings.input.consumer.max-attempts=1
#dlx/dlq setup
spring.cloud.stream.rabbit.bindings.input.consumer.auto-bind-dlq=true
spring.cloud.stream.rabbit.bindings.input.consumer.dlq-ttl=5000
spring.cloud.stream.rabbit.bindings.input.consumer.dlq-dead-letter-exchange=
---
此配置建立一個DLQ(死信佇列),繫結到一個直連交換器(DLX),路由鍵為myDestination.consumerGroup。當訊息被拒絕時,它們會被路由到DLQ。5秒後,訊息過期並使用佇列名稱作為路由鍵路由回原始佇列,如以下示例所示
Spring Boot應用程式
@SpringBootApplication
public class XDeathApplication {
public static void main(String[] args) {
SpringApplication.run(XDeathApplication.class, args);
}
@Bean
public Consumer<Message<String>> listen() {
return message -> {
Map<?,?> death = message.getHeaders().get("x-death");
if (death != null && death.get("count").equals(3L)) {
// giving up - don't send to DLX
throw new ImmediateAcknowledgeAmqpException("Failed after 4 attempts");
}
throw new AmqpRejectAndDontRequeueException("failed");
};
}
}
請注意,x-death頭中的count屬性是一個Long型別。