spring-云流生产者事务性
spring-cloud-stream producer transactionality
我用 kafka 活页夹做了一些测试,看来 spring-cloud-stream 生产者不参与 spring-管理的事务。
给定代码
@RequestMapping(method = RequestMethod.POST)
@Transactional
public Customer insertCustomer(@RequestBody Customer customer) {
customerDao.insertCustomer(customer);
source.output().send(MessageBuilder.withPayload(CustomerEventHelper.createSaveEvent(customer)).build());
if (true) {
throw new RuntimeException("rollback test");
}
return customer;
}
customerDao.insertCustomer调用回滚了,但是kafka消息还是发送了。如果我在将客户插入数据仓库的客户事件中有一个消费者,则数据仓库和记录系统将在事务回滚时不同步。有没有办法在这里使 kafka 活页夹具有事务性?
Kafka binder 不是事务性的,Kafka 一般不支持事务。
我们打算解决 Spring Cloud Stream 1.1 的事务管理问题:https://github.com/spring-cloud/spring-cloud-stream/issues/536。
但是,您现在甚至可以通过像这样注册事务同步来仅在成功提交后发送消息:
TransactionSynchronizationManager.registerSynchronization(
new TransactionSynchronization(){
void afterCommit(){
source.output().send(MessageBuilder.withPayload(event).build());
if (true) {
}
});
我用 kafka 活页夹做了一些测试,看来 spring-cloud-stream 生产者不参与 spring-管理的事务。
给定代码
@RequestMapping(method = RequestMethod.POST)
@Transactional
public Customer insertCustomer(@RequestBody Customer customer) {
customerDao.insertCustomer(customer);
source.output().send(MessageBuilder.withPayload(CustomerEventHelper.createSaveEvent(customer)).build());
if (true) {
throw new RuntimeException("rollback test");
}
return customer;
}
customerDao.insertCustomer调用回滚了,但是kafka消息还是发送了。如果我在将客户插入数据仓库的客户事件中有一个消费者,则数据仓库和记录系统将在事务回滚时不同步。有没有办法在这里使 kafka 活页夹具有事务性?
Kafka binder 不是事务性的,Kafka 一般不支持事务。
我们打算解决 Spring Cloud Stream 1.1 的事务管理问题:https://github.com/spring-cloud/spring-cloud-stream/issues/536。
但是,您现在甚至可以通过像这样注册事务同步来仅在成功提交后发送消息:
TransactionSynchronizationManager.registerSynchronization(
new TransactionSynchronization(){
void afterCommit(){
source.output().send(MessageBuilder.withPayload(event).build());
if (true) {
}
});