我正在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。 –