在我的應用程序的用戶創建它獲取在DB堅持+發佈到春天AMQP隊列同步Hibernate持久+春AMQP發佈交易
後當用戶創建一個帖子流撞擊控制器
@RequestMapping(value="/createPost", method=RequestMethod.POST, consumes = "application/json",
produces = "application/json")
public @ResponseBody Post createUserPost(@RequestBody(required=false) Post post, Principal principal){
this.userService.persistPost(post);
logger.info("post persistance successful");
publishService.publishUserPosts(post);
return post;
}
有兩種服務persistPost
& publishUserPosts
在控制器中調用的不同服務類。
發佈服務
@Transactional
public void publishUserPosts(Post post){
try{
logger.info("Sending user post to the subscribers");
amqpTemplate.convertAndSend(post);
}catch(AmqpException e){
throw new MyAppException(e);
}
}
問題既是服務呼叫在不同的交易運行。如果PublishPost
事務失敗,則該帖子仍然保留在數據庫中。
要將這兩個服務都帶到一個單獨的事務中,我已經更改了代碼&在PublishPost
類中注入了persistPost
服務。
@Transactional
public void publishUserPosts(Post post){
try{
userService.persistPost(post);
logger.info("post persistance successful");
logger.info("Sending user post to the subscribers");
amqpTemplate.convertAndSend(post);
}catch(AmqpException e){
throw new MyAppException(e);
}
}
我的問題
這是下單成交,實現多種業務,最好的辦法還是可以用一些其他的方法做的更好?
可以肯定的是,您使用的是JTA嗎?否則,您用來發送消息的事務並不是真的在做任何事情。 – Augusto
我正在使用HibernateTransactionManager。我測試了代碼,交易工作正常,只需要確認方法。 – underdog