我是Spring Integration的新手,并尝试构建一个使用和处理来自Kafka主题的消息的应用程序。 我能够使用KafkaHighLevelConsumerMessageSourceSpec成功处理消息:
@Bean
IntegrationFlow consumer() {
final KafkaHighLevelConsumerMessageSourceSpec messageSourceSpec = Kafka
.inboundChannelAdapter(new ZookeeperConnect(kafkaProperties.getZookeeperConnect()))
.consumerProperties(
props -> props.put("auto.offset.reset", "smallest").put("auto.commit.interval.ms", "100"))
.addConsumer("myGroup",
metadata -> metadata.consumerTimeout(100)
.topicStreamMap(m -> m.put(kafkaProperties.getTopic(), 1)).maxMessages(100)
.valueDecoder(String::new));
final Consumer<SourcePollingChannelAdapterSpec> endpointConfigurer = e -> e
.poller(p -> p.fixedDelay(100));
return IntegrationFlows.from(messageSourceSpec, endpointConfigurer)
.<Map<String, Map<String, List<String>>>> handle((payload, headers) -> {
itemUpdateHandler.handle(payload, headers);
return null;
}).get();
}
但由于我需要使用Offset Manager,我尝试使用Kafka.messageDriverChannelAdapter进行配置,但我仍然没有弄清楚如何使用消息。 这是我已经尝试过的:
@Bean(name = PollerMetadata.DEFAULT_POLLER)
public PollerMetadata poller() {
return Pollers.fixedDelay(100).get();
}
@Bean
public OffsetManager offsetManager(ConnectionFactory connectionFactory) {
final MetadataStoreOffsetManager offsetManager = new MetadataStoreOffsetManager(connectionFactory);
return offsetManager;
}
@Bean
public IntegrationFlow listeningFromKafkaFlow(ConnectionFactory connectionFactory,
OffsetManager offsetManager) {
return IntegrationFlows
.from(Kafka.messageDriverChannelAdapter(connectionFactory, kafkaProperties.getTopic())
.autoCommitOffset(true).payloadDecoder(String::new).keyDecoder(String::new)
.configureListenerContainer(c -> c.offsetManager(offsetManager).maxFetch(100)))
.channel("fromKafka").get();
}
@Bean
public IntegrationFlow consume() {
return IntegrationFlows.from("fromKafka")
.<Map<String, Map<String, List<String>>>> handle((payload, headers) -> {
itemUpdateHandler.handle(payload, headers);
return null;
}).get();
}
但消息没有消耗掉。我错过了一些配置? 谢谢你的帮助。