死信主題分割區選擇
預設情況下,記錄會使用與原始記錄相同的分割區發布到死信主題。這表示死信主題必須至少具有與原始記錄一樣多的分割區。
若要變更此行為,請將 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 時,它會優先採用該 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 不會自動為應用程式建立主題。這是因為 binder 無法推斷實作可能傳送到的所有 DLQ 主題的名稱。因此,如果您使用此策略提供 DLQ 名稱,則應用程式有責任確保事先建立這些主題。