我正在Spring-AMQP中使用Spring Data REST。我的目标主要是保持由Spring Data REST“自动”处理的POST request中的数据库保存之间的原子性,以及在POST请求之后调用的带注释的@HandleAfterCreate处理程序发送的RabbitMQ消息的发送。在处理简化的例子下面。Spring Data REST和Spring-AMQP事务
EventHandler.java
@RepositoryEventHandler
@Component
public class UserEventHandler {
...
@HandleAfterCreate
public void sendCreatedEvent(User user) {
sendRabbitEvent("CREATED");
}
}
于是我问,如果有任何一种全球性的交易举行提交由Spring数据REST POST过程中,只有处理程序成功运行后,做数据库?
我知道如果我使用@Transactional标记创建控制器并将它们放在一起,它就会按预期工作,但我认为这不是它应该如何与Spring Data REST一起使用。以下是声明POST在控制器工作流程示例:
Controller.java
@RestController
public class MyRestController {
...
@RequestMapping(value = "/foo", method = RequestMethod.POST)
@Transactional
public HttpEntity<MyEntity> create(@RequestBody MyEntity myEntity) {
// do some validations..
// save entity
someRepository.save(myEntity);
// sends RabbitMQ message
sendRabbitEvent("CREATED");
return new ResponseEntity<>(HttpStatus.CREATED);
}
}
有了,如果发送消息失败,内容不会保存到数据库中。这就是我想要使用处理程序模型实现的。
谢谢。
如果注释someRepository.save()方法,在你使用@Transactional库接口会发生什么。如果发生异常,它会完成回滚吗? – SGB
嗨,我相信someRepository.save()中的@ Transactional会考虑保存中的事件。所以只有在完成someRepository.save()之后触发的@ HandleAfterCreate事件处理程序才是独立的,不会被视为事务的一部分。 – gcw
我认为你想象的情况比现在工作的情况更糟。如果事务回滚,那么 - 根据您的要求 - 最终发送一条消息,该消息表示某个时刻您不能确定该创建是否真正起作用。创建后处理*需要*在创建成功后发生*。如果你想发送消息,不管你还可以使用@HandleBeforeCreate。 –