AWS Kinesis客户端Java:在流中设置TRIM_地平线位置不起作用

AWS Kinesis客户端Java:在流中设置TRIM_地平线位置不起作用,java,amazon-kinesis,amazon-kinesis-client,Java,Amazon Kinesis,Amazon Kinesis Client,我正在运行一个测试系统,该系统生成一个动觉生成器,该生成器开始将消息(例如:1到100)写入包含两个碎片的流 在该周期中,消费者开始从流中读取消息。我注意到,消费者只会在流运行后读取流中出现的最新的消息。例如,它从消息43开始读取。我试图修改Worker.class以使用TRIM_HORIZON策略,但这似乎不起作用 KinesisClientLibConfiguration c = new KinesisClientLibConfiguration("MediaPlan", "randeeps

我正在运行一个测试系统,该系统生成一个动觉生成器,该生成器开始将消息(例如:1到100)写入包含两个碎片的流

在该周期中,消费者开始从流中读取消息。我注意到,消费者只会在流运行后读取流中出现的
最新的
消息。例如,它从消息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) {
        ...
    }
}
我希望看到这样的信息:
从TRIM_HORIZON 0开始使用shard-000000000000设置消费者
但我得到的却是:
使用shard sharded-000000000000最迟从0开始设置消费者


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

下面是一个使用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\u HORIZON
这将告诉调度程序在最后一个已知位置之后开始使用记录。因此,即使消费者停机,而生产者仍在运行,消费者停机期间产生的所有记录都将被消耗

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

重要注意:设置(
InitialPositionInStream.TRIM\u HORIZON
)仅在第一个应用程序启动之前有效。在第一次启动时,它存储在DynamoDB表中,然后总是从DynamoDB读取它,完全忽略代码中的设置。要解决此问题,请删除DynamoDB表(将使用代码中的设置再次创建该表),或者将字段
检查点的值更新为
修剪视界