簡體   English   中英

Spring雲stream,kafka binder-點播

[英]Spring cloud stream, kafka binder - seek on demand

我使用 spring 雲 stream 和 kafka。 我有一個主題X ,分區Y和消費者組Z Spring boot starter parent 2.7.2 kafka version 2.8.8

@StreamListener("input-channel-name")
public void processMessage(final DomainObject domainObject) {
    // some processing
}

它工作正常。

我想在應用程序中有一個端點,它允許我重新讀取/重新處理seek對嗎?) XY中的所有消息(再次)。 但不是在重新平衡( ConsumerSeekAware#onPartitionsAssigned )之后或應用程序重啟之后( KafkaConsumerProperties#resetOffsets ),而是像這樣按需:

@RestController
@Slf4j
@RequiredArgsConstructor
public class SeekController {

    @GetMapping
    public void seekToBeginningForDomainObject() {

        /**
         * seekToBeginning for X, Y, input-channel-name
         */
    }
}

我就是做不到。 甚至有可能嗎? 我知道我必須在消費者層面上這樣做,可能是在@StreamListener("input-channel-name")訂閱之后創建的,對吧? 但我不知道如何獲得該消費者。 如何執行按需搜索讓kafka再次向消費者發送消息? 我只想將XYZ的偏移量重置為0 ,以便再次制作應用程序、加載和處理所有消息。

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

KafkaBindingRebalanceListener.onPartitionsAssigned()提供了一個boolean來表示這是否是一個初始賦值Vs。 重新平衡分配。

Spring 雲 stream 目前不支持運行時的任意搜索,即使底層KafkaMessageDrivenChannelAdapter確實支持訪問ConsumerSeekCallback (允許在輪詢之間任意搜索)。 它需要增強活頁夾以允許訪問此代碼。

但是,可以在事件偵聽器中使用空閑容器事件; 該事件包含消費者,因此您可以在這些條件下進行任意搜索。

暫無
暫無

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

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