簡體   English   中英

使用 StreamBridge 在 Spring Cloud Stream 中的生產者回調

[英]Producer callback in Spring Cloud Stream using StreamBridge

我想知道一種使用StreamBridge執行回調的方法,我想做類似於返回KafkaTemplate.sendListenableFuture的事情。

Spring Cloud Stream 是否可以使用 kafka binder 發布一些事件並使用 onSuccess 和 onFailure 之類的回調?

例如: producer.send(record, new callback { ... })

您可以在生產者綁定上設置sync ,並且發送將在內部等待未來完成,或者您可以配置一個recordMetadataChannel以異步獲取發送的結果。

https://docs.spring.io/spring-cloud-stream/docs/current/reference/html/spring-cloud-stream-binder-kafka.html#kafka-producer-properties

記錄元數據頻道

成功發送結果應該發送到的MessageChannel的 bean 名稱; bean 必須存在於應用程序上下文中。 發送到通道的消息是帶有附加標頭KafkaHeaders.RECORD_METADATA的已發送消息(轉換后,如果有)。 頭部包含Kafka客戶端提供的RecordMetadata對象; 它包括在主題中寫入記錄的分區和偏移量。

ResultMetadata meta = 
    sendResultMsg.getHeaders().get(KafkaHeaders.RECORD_METADATA, RecordMetadata.class)

失敗的發送進入生產者錯誤通道(如果已配置); 請參閱錯誤通道。

https://docs.spring.io/spring-cloud-stream/docs/current/reference/html/spring-cloud-stream-binder-kafka.html#kafka-error-channels

編輯

這是一個例子:

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.

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