使用OffsetManager进行Spring集成Kafka

时间:2015-10-26 15:12:45

标签: spring-integration apache-kafka

我是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();
}

但消息没有消耗掉。我错过了一些配置? 谢谢你的帮助。

0 个答案:

没有答案