死信主题分区选择
按默认值,记录使用与原始记录相同的分区发布到死信主题。这意味着死信主题必须至少具有与原始记录相同的分区数。
要更改此行为,请添加一个DlqPartitionFunction实现作为@Bean到应用程序上下文中。 只能有一个这样的Bean存在。 函数接收消费者组、失败的ConsumerRecord和异常。 例如,如果总是想路由到分区0,可以使用:
@Bean
public DlqPartitionFunction partitionFunction() {
return (group, record, ex) -> 0;
}
如果您将消费者绑定的dlqPartitions属性设置为1(且绑定器的minPartitionCount等于1),则无需提供DlqPartitionFunction;框架将始终使用分区0。如果您将消费者绑定的 |
还可以为死信队列(DLQ)主题定义一个自定义名称。为此,需要创建DlqDestinationResolver的一个实现作为@Bean添加到应用程序上下文中。当绑定器检测到此类bean时,它将优先使用该bean,否则会使用dlqName属性。如果未找到这些选项,则默认使用error.<destination>.<group>。下面是一个DlqDestinationResolver作为@Bean的例子。
@Bean
public DlqDestinationResolver dlqDestinationResolver() {
return (rec, ex) -> {
if (rec.topic().equals("word1")) {
return "topic1-dlq";
}
else {
return "topic2-dlq";
}
};
}
在为DlqDestinationResolver提供实现时需要注意,绑定器中的提供器不会自动为应用程序创建主题。
这是因为绑定器无法推断实现可能发送到的所有DLQ主题的名称。
因此,如果使用这种策略提供DLQ名称,就由应用程序负责确保这些主题在之前已创建好。