[英]How can create a producer using Spring Cloud Kafka Stream 3.1
[英]Producer callback in Spring Cloud Stream using StreamBridge
我想知道一種使用StreamBridge
執行回調的方法,我想做類似於返回KafkaTemplate.send
的ListenableFuture
的事情。
Spring Cloud Stream 是否可以使用 kafka binder 發布一些事件並使用 onSuccess 和 onFailure 之類的回調?
例如: producer.send(record, new callback { ... })
您可以在生產者綁定上設置sync
,並且發送將在內部等待未來完成,或者您可以配置一個recordMetadataChannel
以異步獲取發送的結果。
記錄元數據頻道
成功發送結果應該發送到的
MessageChannel
的 bean 名稱; bean 必須存在於應用程序上下文中。 發送到通道的消息是帶有附加標頭KafkaHeaders.RECORD_METADATA
的已發送消息(轉換后,如果有)。 頭部包含Kafka客戶端提供的RecordMetadata
對象; 它包括在主題中寫入記錄的分區和偏移量。
ResultMetadata meta =
sendResultMsg.getHeaders().get(KafkaHeaders.RECORD_METADATA, RecordMetadata.class)
失敗的發送進入生產者錯誤通道(如果已配置); 請參閱錯誤通道。
編輯
這是一個例子:
spring.cloud.stream.bindings.output-out-0.destination=dest1
spring.cloud.stream.bindings.output-out-0.producer.error-channel-enabled=true
spring.cloud.stream.kafka.bindings.output-out-0.producer.record-metadata-channel=meta
spring.cloud.stream.kafka.bindings.output-out-0.producer.configuration.[max.block.ms]=5000
spring.cloud.stream.kafka.bindings.output-out-0.producer.configuration.[request.timeout.ms]=5000
spring.cloud.stream.kafka.bindings.output-out-0.producer.configuration.[retries]=0
@SpringBootApplication
public class So72900966Application {
public static void main(String[] args) {
SpringApplication.run(So72900966Application.class, args);
}
@Bean
ApplicationRunner runner(StreamBridge bridge) {
return args -> {
bridge.send("output-out-0", "foo");
System.out.println("Delete topic dest1 from broker; then hit Enter");
System.in.read();
bridge.send("output-out-0", "foo");
Thread.sleep(2_000);
};
}
}
@Component
class ResultHandler {
@ServiceActivator(inputChannel = "meta")
void meta(Message<?> result) {
System.out.println(result.getHeaders().get(KafkaHeaders.RECORD_METADATA, RecordMetadata.class));
}
@ServiceActivator(inputChannel = "errorChannel")
void errors(Message<?> error) {
System.out.println(error);
}
}
收到第一個結果后:
kafka-topics.sh --bootstrap-server localhost:9092 --delete --topic dest1
然后點擊進入。
結果:
Delete topic dest1 from broker; then hit Enter
dest1-0@0
...
ErrorMessage [payload=org.springframework.integration.kafka.support.KafkaSendFailureException: ...
2022-07-07 13:36:19.185 ERROR 11735 --- [ad | producer-1] o.s.k.support.LoggingProducerListener : Exception thrown when sending a message with key='null' and payload='byte[3]' to topic dest1:
org.apache.kafka.common.errors.UnknownTopicOrPartitionException: This server does not host this topic-partition.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.