2015-05-28 83 views
2

我正在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); 
    } 
} 

有了,如果发送消息失败,内容不会保存到数据库中。这就是我想要使用处理程序模型实现的。

谢谢。

+0

如果注释someRepository.save()方法,在你使用@Transactional库接口会发生什么。如果发生异常,它会完成回滚吗? – SGB

+0

嗨,我相信someRepository.save()中的@ Transactional会考虑保存中的事件。所以只有在完成someRepository.save()之后触发的@ HandleAfterCreate事件处理程序才是独立的,不会被视为事务的一部分。 – gcw

+0

我认为你想象的情况比现在工作的情况更糟。如果事务回滚,那么 - 根据您的要求 - 最终发送一条消息,该消息表示某个时刻您不能确定该创建是否真正起作用。创建后处理*需要*在创建成功后发生*。如果你想发送消息,不管你还可以使用@HandleBeforeCreate。 –

回答