如何确认用户使用Spring Integration Kafka阅读的Kafka消息

时间:2019-05-19 13:57:23

标签: spring-integration spring-kafka

我们正在使用spring-integration-kafka版本3.1.2RELEASE和int-kafka:message-driven-channel-adapter来使用来自远程kafka主题的消息。生产者发送加密的消息,而我们正在使用反序列化器解密实际的消息。我们可以使用主题中发布的所有消息。我们将自动提交用作false。我们想知道在成功处理消息后如何从服务中提交或确认消息。有人可以帮助我们如何落实从消息驱动通道读取的消息并提供一些参考实现吗?

当我们将自动提交设置为true时,我们假设它将在提交间隔之后提交消息,但是我们希望在我们的服务中对其进行处理。我遇到了以下示例,但是在反序列化而不是spring集成消息之后,我们收到了一个自定义对象。 因此我们想知道如何在转换器中实现类似的确认,以便在转换过程中发生任何错误时,我们不会提交该消息。成功转换后提交消息。

  Acknowledgment acknowledgment = message.getHeaders().get(KafkaHeaders.ACKNOWLEDGMENT, Acknowledgment.class); 
  if(acknowledgment != null) { System.out.println("Acknowledgment provided");
  acknowledgment.acknowledge(); }
   }



<int-kafka:message-driven-channel-adapter
    id="kafkaMessageListener"
    listener-container="kafkaMessageContainer" auto-startup="true"
    phase="100" send-timeout="5000" mode="record"
    message-converter="messageConverter"
    recovery-callback="recoveryCallback" error-message-strategy="ems"
    channel="inputFromKafkaChannel" error-channel="errorChannel" />

<int:transformer id="transformerid"
    ref="transformerBean"
    input-channel="inputFromKafkaChannel" method="transform"
    output-channel="messageTransformer" />

<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="${spring.kafka.bootstrap-servers}" />
                    <entry key="enable.auto.commit" value="false" />
                    <entry key="auto.commit.interval.ms" value="100" />
                    <entry key="session.timeout.ms" value="15000" />
                    <entry key="group.id" value="${spring.kafka.consumer.group-id}" />
                    <entry key="key.deserializer"
                        value="org.apache.kafka.common.serialization.StringDeserializer" />
                    <entry key="value.deserializer"
                        value="com.test.CustomDeserializer" />
                </map>
            </constructor-arg>
        </bean>
    </constructor-arg>
    <constructor-arg>
        <bean class="org.springframework.kafka.listener.ContainerProperties">
            <constructor-arg name="topics" value="${spring.kafka.topics}" />
        </bean>
    </constructor-arg>
</bean>

1 个答案:

答案 0 :(得分:0)

auto.commit.offset=true表示kafka-clients库提交偏移量。

为false时(默认为Apache Kafka的Spring首选),侦听器容器在默认情况下由poll()接收到每个批处理后提交偏移量,但是该机制由容器的AckMode属性控制。

请参见Committing Offsets

如果将容器的AckMode设置为MANUALMANUAL_IMMEDIATE,则您的应用程序必须使用Acknowledgment对象执行提交。

使用Spring Integration时,Acknowledgment标头中提供KafkaHeaders.ACKNOWLEDGMENT对象。

在大多数情况下,应使用AckMode.BATCH(默认)或AckMode.RECORD,并且您的应用程序不必担心提交偏移量。