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