使用spring integration kafka重新处理maprstream消息

时间:2018-03-15 06:55:37

标签: spring-integration kafka-consumer-api spring-kafka mapr-streams

这与thread有关,我使用spring-integration-kafka 2.0来使用mapr stream主题的消息。 我使用KafkaConsumer功能 - 重新处理maprstream消息 - 使用偏移和主题分区时遇到困难。

如果我可以集成搜索功能,我将能够根据偏移值重新处理消息。

有人可以帮我在春季整合Kafka中整合KafkaConsumer功能seek, seekToBegining, seekToEnd吗?目前的消费者配置如下所述:

 <int-kafka:message-driven-channel-adapter
    id="kafkaListener"
    listener-container="container1"
    auto-startup="true"
    phase="100"
    send-timeout="5000"
    channel="inputFromStream"
    error-channel="errorChannel" />

<bean id="container1" class="org.springframework.kafka.listener.KafkaMessageListenerContainer">
    <constructor-arg>
        <bean class="org.springframework.kafka.core.DefaultKafkaConsumerFactory">
            <constructor-arg>
            <map>
                <entry key="bootstrap.servers" value="localhost:9092"/>
                <entry key="group.id" value="siTestGroup1"/>
                <entry key="enable.auto.commit" value="true"/>
                <entry key="auto.commit.interval.ms" value="1000"/>
                <entry key="auto.offset.reset" value="earliest" /> 
                <entry key="max.partition.fetch.bytes" value="3145728"/>
                <entry key="key.deserializer" value="org.apache.kafka.common.serialization.StringDeserializer"/>
                <entry key="value.deserializer" value="org.apache.kafka.common.serialization.StringDeserializer"/> 
            </map>
            </constructor-arg>
        </bean>
    </constructor-arg>
    <constructor-arg>
        <bean class="org.springframework.kafka.listener.config.ContainerProperties">
            <constructor-arg name="topics" value="${maprstream.topicname}" />
        </bean>
    </constructor-arg> 
</bean>

1 个答案:

答案 0 :(得分:1)

使用final AtomicBoolean initialAssignment = new AtomicBoolean(true); if (!"earliest".equals(resetTo) && "!latest".equals(resetTo)) { logger.warn("no (or unknown) " + ConsumerConfig.AUTO_OFFSET_RESET_CONFIG + " property cannot reset"); resetOffsets = false; } if (groupManagement && resetOffsets) { containerProperties.setConsumerRebalanceListener(new ConsumerAwareRebalanceListener() { @Override public void onPartitionsRevokedBeforeCommit(Consumer<?, ?> consumer, Collection<TopicPartition> tps) { // no op } @Override public void onPartitionsRevokedAfterCommit(Consumer<?, ?> consumer, Collection<TopicPartition> tps) { // no op } @Override public void onPartitionsAssigned(Consumer<?, ?> consumer, Collection<TopicPartition> tps) { if (initialAssignment.getAndSet(false)) { if ("earliest".equals(resetTo)) { consumer.seekToBeginning(tps); } else if ("latest".equals(resetTo)) { consumer.seekToEnd(tps); } } } }); } else if (resetOffsets) { Arrays.stream(containerProperties.getTopicPartitions()) .map(tpio -> new TopicPartitionInitialOffset(tpio.topic(), tpio.partition(), // SK GH-599 "earliest".equals(resetTo) ? SeekPosition.BEGINNING : SeekPosition.END)) "earliest".equals(resetTo) ? 0L : Long.MAX_VALUE)) .collect(Collectors.toList()).toArray(containerProperties.getTopicPartitions()); } - 这就是Spring Cloud Stream的功能......

cryptography