我正在运行一个测试系统,该系统产生一个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
如何让我的消费者停止阅读最新消息并阅读所有未处理的消息?
答案 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)