Java 仅限Spring Kafka事务性消费者

Java 仅限Spring Kafka事务性消费者,java,spring,transactions,apache-kafka,spring-kafka,Java,Spring,Transactions,Apache Kafka,Spring Kafka,引用似乎可以将侦听器容器配置为将offset commit绑定到事务。 由于本段是在下报告的,因此从上下文中我可以看出,以事务方式配置侦听器容器是在提交生产者事务之前执行其验证的一种方法 只消费怎么样?是否可以使用KafkCamessageListenerContainer(使用kafkatransactionmanager配置)以事务方式提交已使用消息的偏移量?我想不会,因为kafkaproducer和kafkaconsumer不是同一个api不完全清楚您想要实现什么 Kafka中事务的意图是

引用似乎可以将侦听器容器配置为将offset commit绑定到事务。 由于本段是在下报告的,因此从上下文中我可以看出,以事务方式配置侦听器容器是在提交生产者事务之前执行其验证的一种方法


只消费怎么样?是否可以使用KafkCamessageListenerContainer(使用kafkatransactionmanager配置)以事务方式提交已使用消息的偏移量?我想不会,因为kafkaproducer和kafkaconsumer不是同一个api

不完全清楚您想要实现什么

Kafka中事务的意图是,任何生产者发送和消费者偏移提交都是原子的(全部输入或全部输出)

容器不知道监听器是否实际发布了任何消息,因此它将以相同的方式工作(向事务发送使用者偏移量)

如果您想发布一些不属于事务一部分的消息,可以使用另一个(非事务性)生产商工厂的
KafkaTemplate
来发布。这样,模板将找不到事务的生产者并使用来自第二生产者工厂的生产者。如果事务回滚,则不会返回已发布的消息

编辑

如果侦听器容器配置了其他事务管理器(除了
KafkaTransactionManager
,包括链式事务管理器),则容器无法向事务发送偏移量,因为它无法访问事务的
生产者
。您可以使用
KafkaTemplate
将偏移量发送到侦听器中的事务;它将使用事务的生产者

但是,有两种方法可以满足您的需求

  • 使用
    KTM
    配置容器,并使用
    @Transactional
    为侦听器添加注释-使用DB TxM-在正常情况下,DB tx将提交,容器将提交。对于故障,DB将回滚,Kafka TX将回滚

  • 不要使用Kafka TM并配置,如果侦听器引发异常,容器将重播失败的传递


  • 我有一个微型服务,这是唯一的消费者。主要目标是找到一种将使用者偏移量提交策略绑定到数据库事务结果的方法。我现在了解到,事务性支持仅指生产者和消费者之间的分布式卡夫卡事务。断言使用者提交偏移量生成事务结果(成功或回滚)是正确的吗?我是否可以将链式事务管理器(kafka+dB)也用于仅供消费者使用的微服务,注意按照doc@GaryRussell的说明在kafkatemplate上手动调用SendConsumerofset?我也在处理类似的用例,根据您的第二条评论,如果我们使用SeekToCurrentErrorHandler来处理异常,那么在执行DB tx时也有可能出现一些异常。在这种情况下,我需要回滚整个事务。所以我的问题是,如果我们遵循第二条注释,我需要在两个层上使用事务性注释,即侦听器层和DB层。对的另外,由于我已经为失败的消息配置了死信主题,它是否会在实际主题中提交这些消息的偏移量?不要在对旧答案的评论中提问,尤其是当它们超过一年时。框架不断演变;不断增加新功能;现在答案可能不同了。提出一个新问题,并详细说明你想要达到的目标。您应该永远不需要在侦听器上使用
    @Transactional