|
该版本仍在开发中,尚未被视为稳定。对于最新稳定版本,请使用 spring-cloud-stream 5.0.0! |
死字主题划分选择
默认情况下,记录会以与原始记录相同的分区发布到死信主题。 这意味着死信主题的分区数量必须至少与原始记录相当。
要改变这种行为,可以添加一个DlqPartitionFunction作为@Bean切换到应用上下文。
只能有一颗这样的豆子存在。
该函数由消费者组提供,失败消费者记录也是例外。
例如,如果你总是想路由到分区 0,可以使用:
@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.
@Bean
public DlqDestinationResolver dlqDestinationResolver() {
return (rec, ex) -> {
if (rec.topic().equals("word1")) {
return "topic1-dlq";
}
else {
return "topic2-dlq";
}
};
}
在为 提供实现时,有一点很重要要记住DlqDestinationResolver就是 Binder 中的 provisioner 不会自动为应用创建主题。
这是因为绑定器无法推断实现可能发送的所有DLQ主题名称。
因此,如果你用这种策略提供DLQ名称,应用程序有责任确保这些主题事先被创建。