对于最新的稳定版本,请使用 spring-cloud-stream 4.3.0spring-doc.cadn.net.cn

死信主题分区选择

默认情况下,记录使用与原始记录相同的分区发布到死信主题。 这意味着死信主题必须至少具有与原始记录一样多的分区。spring-doc.cadn.net.cn

要更改此行为,请添加一个DlqPartitionFunction实现为@Bean到应用程序上下文。 只能存在一个这样的豆子。 该函数是随消费者组提供的,失败的ConsumerRecord和例外。 例如,如果您始终想要路由到分区 0,则可以使用:spring-doc.cadn.net.cn

@Bean
public DlqPartitionFunction partitionFunction() {
    return (group, record, ex) -> 0;
}
如果将使用者绑定的dlqPartitions属性设置为 1(以及活页夹的minPartitionCount等于1),无需提供DlqPartitionFunction;框架将始终使用分区 0。 如果将使用者绑定的dlqPartitions属性设置为大于1(或活页夹的minPartitionCount大于1),您必须提供一个DlqPartitionFunctionbean,即使分区计数与原始主题的分区计数相同。

还可以为 DLQ 主题定义自定义名称。 为此,请创建DlqDestinationResolver作为@Bean到应用程序上下文。 当 binder 检测到这样的 bean 时,优先,否则它将使用dlqName财产。 如果都未找到,则默认为error.<destination>.<group>. 下面是一个示例DlqDestinationResolver作为@Bean.spring-doc.cadn.net.cn

@Bean
public DlqDestinationResolver dlqDestinationResolver() {
    return (rec, ex) -> {
        if (rec.topic().equals("word1")) {
            return "topic1-dlq";
        }
        else {
            return "topic2-dlq";
        }
    };
}

在提供实现时要记住的一件重要事情DlqDestinationResolver是 binder 中的 provisioner 不会为应用程序自动创建主题。 这是因为活页夹无法推断出实现可能发送到的所有 DLQ 主题的名称。 因此,如果使用此策略提供 DLQ 名称,则应用程序有责任确保事先创建这些主题。spring-doc.cadn.net.cn