死信主题分区选择
默认情况下,记录使用与原始记录相同的分区发布到死信主题。 这意味着死信主题必须至少具有与原始记录一样多的分区。
要更改此行为,请添加一个DlqPartitionFunction
实现为@Bean
到应用程序上下文。
只能存在一个这样的豆子。
该函数是随消费者组提供的,失败的ConsumerRecord
和例外。
例如,如果您始终想要路由到分区 0,则可以使用:
@Bean
public DlqPartitionFunction partitionFunction() {
return (group, record, ex) -> 0;
}
如果将使用者绑定的dlqPartitions 属性设置为 1(以及活页夹的minPartitionCount 等于1 ),无需提供DlqPartitionFunction ;框架将始终使用分区 0。
如果将使用者绑定的dlqPartitions 属性设置为大于1 (或活页夹的minPartitionCount 大于1 ),您必须提供一个DlqPartitionFunction bean,即使分区计数与原始主题的分区计数相同。 |
还可以为 DLQ 主题定义自定义名称。
为此,请创建DlqDestinationResolver
作为@Bean
到应用程序上下文。
当 binder 检测到这样的 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
是 binder 中的 provisioner 不会为应用程序自动创建主题。
这是因为活页夹无法推断出实现可能发送到的所有 DLQ 主题的名称。
因此,如果使用此策略提供 DLQ 名称,则应用程序有责任确保事先创建这些主题。