簡體   English   中英

如何在拋出異常時添加其他自定義標頭以將消息存儲在 kafka 上的 dlq 中?

[英]How to add additional custom headers while throwing exception to store the message in dlq on kafka?

我有一個監聽 kafka 主題的消費者應用程序,在異常時它按預期將記錄發送到 dlq(dead-letter-queue)。

在拋出異常之前 iam 在消費者應用程序中設置 header 並且它正在設置但它沒有發送到死信主題,死信主題只有內置標題,如'x-exception-message','x- original-partition'等..而不是我設置的那個。

下面是我的消費者應用程序中的一段代碼:

modifiedMessage = MessageBuilder.fromMessage(consumedMessage).setHeader("x-ecode", new Integer(100)).setHeader(BinderHeaders.PARTITION_OVERRIDE,consumedMessage.getHeaders().get(KafkaHeaders.RECEIVED_PARTITION_ID)).build();
System.out.println("error header:"+modifiedMessage.getHeaders().get("x-ecode",Integer.class)); //100
throw new RuntimeException(modifiedMessage.toString());

注意:我在 spring.cloud.stream.kafka.binder.header=x-ecode 下的 application.yml 中設置 x-code

在上面的代碼中,我能夠設置 header,並實際驗證它已設置但未發送到死信主題。

有效負載正在正確發送,我如何將 header 發送到死信主題? 我需要在我的 application.yml 中添加任何屬性以啟用它發送嗎?

您所做的只是創建一條新消息並將其丟棄(除非您將異常消息設置為其字符串實現。

這不會修改原始入站消息。

您可以簡單地添加一個新的 output 綁定,然后自己將修改后的消息發送給它。

或者,如果您只添加一個常量,您可以將ChannelInterceptor添加到綁定的錯誤通道並在那里修改消息。 如果您需要將 state 傳遞給攔截器,您可以使用自定義異常。

但是,最簡單的解決方案是自己發布消息,而不是使用 binder 的 DLQ 機制。 您已經有了創建消息的邏輯,因此它只是myCustomDlqBinding.send(modifiedMessage) (也添加了標准的 DLQ 標頭)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM