我在Spring-AMQP中使用Spring Data REST。我的目标基本上是保持数据库保存之间的原子性在POST request处理"自动"通过Spring Data REST,以及发送由带注释的@HandleAfterCreate处理程序发送的RabbitMQ消息,该处理程序在POST请求之后调用。处理程序简化示例下方。
EventHandler.java
@RepositoryEventHandler
@Component
public class UserEventHandler {
...
@HandleAfterCreate
public void sendCreatedEvent(User user) {
sendRabbitEvent("CREATED");
}
}
所以我问是否有任何类型的全局事务来保存Spring Data REST POST提交的数据库提交只有在处理程序成功运行后才能执行它?
我知道如果我使用@Transactional标记创建一个控制器并将它们放在一起,它会按预期工作,但我认为它不应该如何与Spring Data REST一起使用。下面是一个在Controller中声明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);
}
}
这样,如果消息发送失败,则内容不会保存到数据库中。这就是我想要使用处理程序模型实现的目标。
感谢。
答案 0 :(得分:0)
您可以使用spring 4.2版本中找到的事务绑定事件。