仅限Spring Kafka交易消费者

时间:2017-12-11 12:09:11

标签: java spring transactions apache-kafka spring-kafka

参考spring-kafka doc似乎可以配置侦听器容器以将偏移提交绑定到事务。 由于此段落是在Producer section下报告的,因此从上下文中我可以假设在事务上配置侦听器容器是一种在提交之前执行生产者事务验证的方法。

仅消费?是否可以使用kafkamessagelistenercontainer(使用kafkatransactionmanager配置)以事务方式提交消耗的消息的偏移量?我想不,因为kafkaproducer和kafkaconsumer不是同一个api

1 个答案:

答案 0 :(得分:1)

你想要实现的目标并不完全清楚。

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

容器不知道监听器是否实际发布了任何消息,因此无论如何它都将起作用(将消费者偏移发送到事务)。

如果要发布某些的事务消息,可以使用class AppComponent extends React.Component { constructor(props){ super(props); this.state = {serverArr: ['Server 1', 'Server2']}; this.addServer = this.addServer.bind(this); } function addServer() { } render(){ return ( <div> <ServerList server={serverArr}/> <button onClick={this.addServer}>Add</button> </div> ); } } 与其他(非事务性)生产者工厂一起使用。这样,模板将找不到事务的生产者并使用来自第二个生产者工厂的生产者。如果事务回滚,则发布的消息不会。

修改

如果侦听器容器配置了某个其他事务管理器(override func viewDidLoad() { super.viewDidLoad() performSegue(withIdentifier: NSStoryboardSegue.Identifier(rawValue: "browse"), sender: self) } 除外,包括链式事务管理器),则容器无法将偏移发送到事务,因为它可以&#39;访问交易KafkaTemplate。您可以使用KafkaTransactionManager将偏移量发送给侦听器中的事务;它将使用交易的生产者。

但是,有两种方法可以做你想做的事。

  1. 使用Producer配置容器并用KafkaTemplate注释您的监听器 - 使用DB TxM - 对于正常情况,DB tx将提交并且容器将提交。对于失败,数据库将回滚,Kafka TX将回滚。

  2. 不要使用Kafka TM并配置new SeekToCurrentErrorHandler,如果侦听器抛出异常,容器将重播失败的传递。