该版本仍在开发中,尚未被视为稳定。对于最新稳定版本,请使用 spring-cloud-stream 5.0.0!spring-doc.cadn.net.cn

死字主题划分选择

默认情况下,记录会以与原始记录相同的分区发布到死信主题。 这意味着死信主题的分区数量必须至少与原始记录相当。spring-doc.cadn.net.cn

要改变这种行为,可以添加一个DlqPartitionFunction作为@Bean切换到应用上下文。 只能有一颗这样的豆子存在。 该函数由消费者组提供,失败消费者记录也是例外。 例如,如果你总是想路由到分区 0,可以使用:spring-doc.cadn.net.cn

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

也可以为DLQ主题定义自定义名称。 为此,创建一个实现DlqDestinationResolver作为@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