AWS Kinesis Client Java:在Stream中设置TRIM_HORIZON位置不起作用

时间:2019-05-08 18:30:49

标签: java amazon-kinesis amazon-kinesis-client

我正在运行一个测试系统,该系统产生一个Kinesis生产者,该生产者开始将消息(例如:1到100)写入具有两个分片的流中。

在此周期中,消费者开始从流中读取消息。我注意到使用者在运行后仅读取流中的LATEST消息。因此,例如,它从消息43开始读取。我尝试修改Worker.class以使用TRIM_HORIZON策略,但这似乎不起作用。

KinesisClientLibConfiguration c = new KinesisClientLibConfiguration("MediaPlan", "randeepstream",
    DefaultAWSCredentialsProviderChain.getInstance(),
    "consumer1")
    .withInitialPositionInStream(InitialPositionInStream.TRIM_HORIZON);
final Worker w = new Worker.Builder()
    .recordProcessorFactory(rpf)
    .config(kinesisConfig)
    .build();
new Thread(() -> w.run()).start();

我的消费者的处理器设置为:

public class ConsumerRecordProcessorImpl implements IRecordProcessor {

    public void initialize(InitializationInput initializationInput) {
        log.info("Setting up consumer with shard {} starting at {}", initializationInput.getShardId(),
                initializationInput.getExtendedSequenceNumber());
    }

    public void processRecords(ProcessRecordsInput processRecordsInput) {
        ...
    }
}

我希望看到如下消息: Setting up consumer with shard shardId-000000000000 starting at TRIM_HORIZON 0 但是我得到了: Setting up consumer with shard shardId-000000000000 starting at LATEST 0

如何让我的消费者停止阅读最新消息并阅读所有未处理的消息?

1 个答案:

答案 0 :(得分:1)

这里是使用amazon-kinesis-client lib v2的示例。

您将必须使用Schedular(software.amazon.kinesis.coordinator),它会在后台读取记录并按以下方式向此调度程序提供检索配置

RetrievalConfig retrievalConfig = setRetrievalConfig();

Scheduler scheduler = new Scheduler(
        configsBuilder.checkpointConfig(),
        configsBuilder.coordinatorConfig(),
        configsBuilder.leaseManagementConfig(),
        configsBuilder.lifecycleConfig(),
        configsBuilder.metricsConfig(),
        configsBuilder.processorConfig(),
        retrievalConfig);

private RetrievalConfig setRetrievalConfig(){
    InitialPositionInStreamExtended initialPositionInStreamExtended = InitialPositionInStreamExtended.newInitialPosition(InitialPositionInStream.TRIM_HORIZON);
    RetrievalConfig retrievalConfig = configsBuilder.retrievalConfig().retrievalSpecificConfig(new PollingConfig(streamName, kinesisClient));
    retrievalConfig.initialPositionInStreamExtended(initialPositionInStreamExtended);
    return retrievalConfig;
}

请注意InitialPositionInStream.TRIM_HORIZON,这将通知调度程序在最后一个已知位置之后开始消耗记录。因此,即使消费者关闭并且生产者仍在运行,在消费者停机期间产生的所有记录也会被消耗。

注意:configBuilder是ConfigsBuilder的对象(software.amazon.kinesis.common)