2015-05-28 131 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。 –

回答