日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解基于Spring Data的領域事件發布

瀏覽:40日期:2023-09-13 08:18:25

領域事件發布是一個領域對象為了讓其它對象知道自己已經處理完成某個操作時發出的一個通知,事件發布力求從代碼層面讓自身對象與外部對象解耦,并減少技術代碼入侵。

一、 手動發布事件

// 實體定義@Entitypublic class Department implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer departmentId; @Enumerated(EnumType.STRING) private State state;}// 事件定義public class DepartmentEvent { private Department department; private State state; public DepartmentEvent(Department department) { this.department = department; state = department.getState(); }}// 領域服務@Servicepublic class ApplicationService { @Autowired private ApplicationEventPublisher applicationEventPublisher; @Autowired private DepartmentRepository departmentRepository; @Transactional(rollbackFor = Exception.class) public void departmentAdd(Department department) { departmentRepository.save(department); // 事件發布 applicationEventPublisher.publishEvent(new DepartmentEvent(department)); }}

使用applicationEventPublisher.publishEvent在領域服務處理完成后發布領域事件,此方法需要在業務代碼中顯式發布事件,并在領域服務里引入ApplicationEventPublisher類,但對領域服務本身有一定的入侵性,但靈活性較高。

二、 自動發布事件

// 實體定義@Entitypublic class SaleOrder implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer orderId; @Enumerated(EnumType.STRING) private State state; // 返回類型定義 @DomainEvents public List<Object> domainEvents(){ return Stream.of(new SaleOrderEvent(this)).collect(Collectors.toList()); } // 事件發布后callback @AfterDomainEventPublication void callback() { System.err.println('ok'); }}// 事件定義public class SaleOrderEvent { private SaleOrder saleOrder; private State state; public SaleOrderEvent(SaleOrder saleOrder) { this.saleOrder = saleOrder; state = saleOrder.getState(); }}// 領域服務@Servicepublic class ApplicationService { @Autowired private OrderRepository orderRepository; @Transactional(rollbackFor = Exception.class) public void saleOrderAdd(SaleOrder saleOrder) { orderRepository.save(saleOrder); }}

使用@DomainEvents定義事件返回的類型,必須是一個集合,使用@AfterDomainEventPublication定義事件發布后的回調。

此方法實事件類型定義在實體中,與領域服務完全解耦,沒有入侵。系統會在orderRepository.save(saleOrder)后自動調用事件發布,另delete方法不會調用事件發布。

三、 事件監聽

@Componentpublic class ApplicationEventProcessor { @EventListener(condition = '#departmentEvent.getState().toString() == ’SUCCEED’') public void departmentCreated(DepartmentEvent departmentEvent) { System.err.println('dept-event1:' + departmentEvent); } @Async @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT, condition = '#saleOrderEvent.getState().toString() == ’SUCCEED’') public void saleOrderCreated(SaleOrderEvent saleOrderEvent) { System.err.println('sale-event succeed1:' + saleOrderEvent); } @TransactionalEventListener(phase = TransactionPhase.BEFORE_COMMIT, condition = '#saleOrderEvent.getState().toString() == ’SUCCEED’') public void saleOrderCreatedBefore(SaleOrderEvent saleOrderEvent) { System.err.println('sale-event succeed2:' + saleOrderEvent); } @Async @TransactionalEventListener(phase = TransactionPhase.AFTER_ROLLBACK) public void saleOrderCreatedFailed(SaleOrderEvent saleOrderEvent) { System.out.println('sale-event failed:' + saleOrderEvent); }}

1. 使用@EventListener監聽事件

@EventListener沒有事務支持,只要事件發出就可監控到

@Transactional(rollbackFor = Exception.class)public void departmentAdd(Department department) { departmentRepository.save(department); applicationEventPublisher.publishEvent(new DepartmentEvent(department)); throw new RuntimeException('failed');}

上述情況會造成事務失敗回滾,但事件監控端已經執行,可能導致數據不一致的情況發生

2. 使用@TransactionalEventListener監聽事件

TransactionPhase.BEFORE_COMMIT 事務提交前 TransactionPhase.AFTER_COMMIT 事務提交后 TransactionPhase.AFTER_ROLLBACK 事務回滾后 TransactionPhase.AFTER_COMPLETION 事務完成后

使用TransactionPhase.AFTER_COMMIT可在事務完成后,再執行事件監聽方法,從而保證數據的一致性

3. TransactionPhase.AFTER_ROLLBACK回滾事務問題

@Async@TransactionalEventListener(phase = TransactionPhase.AFTER_ROLLBACK, condition = '#departmentEvent.getState().toString() == ’SUCCEED’')public void departmentCreatedFailed(DepartmentEvent departmentEvent) { System.err.println('dept-event3:' + departmentEvent);}

由于@DomainEvents作用在實體上的,只有剛orderRepository.save(saleOrder)執行成功后才會發送事件,故AFTER_ROLLBACK方法只會在同一事務中其它語句執行失敗或顯式rollback時才會執行,如果save方法執行失敗,將不會監聽到回滾事件。

4. @Async異步事件監聽

沒有此注解事件監聽方法與主方法為一個事務。 使用此注解將脫離原有事務,BEFORE_COMMIT也無法攔截事務提交前時刻 此注解需要配合@EnableAsync一起使用

四、 總結

通過對 @DomainEvents、@TransactionalEventListener的使用,在有效的解決領域事件發布的情況下,減少了對業務代碼的入侵,同時盡一步解決了數據一致性問題。

在分布式結構下,通過MQ發送事件通知給其它服務,為解決一致性問題,防止對方服務處理失敗可先將事件保久化到數據庫后,再重試。

五、 源碼

https://gitee.com/hypier/barry-jpa/tree/master/jpa-section-5

到此這篇關于詳解基于Spring Data的領域事件發布的文章就介紹到這了,更多相關Spring Data 領域事件內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美男人天堂| 久久99国产精品视频| 欧美黄色网页| 福利一区视频| 激情国产在线| 日韩黄色大片| 欧洲一区二区三区精品| 欧洲av不卡| 在线日韩一区| 性欧美xxxx免费岛国不卡电影| 色网在线免费观看| 欧美精品日日操| 久久国产中文字幕| 精品九九在线| bbw在线视频| 日本国产精品| 宅男在线一区| 视频一区在线视频| 香蕉成人久久| 日韩中文字幕一区二区高清99| 日本h片久久| 免费视频一区二区三区在线观看| 国产精品成人一区二区网站软件| 国产亚洲欧美日韩在线观看一区二区| 国产欧美日韩在线一区二区| 久久精品一本| 99精品视频在线| 亚洲欧美久久| 亚洲资源网站| 国产精品视频一区视频二区| 日韩成人a**站| 99国产精品久久久久久久| 中文字幕亚洲影视| 国产精品香蕉| 久久高清精品| 蜜臀av性久久久久蜜臀aⅴ流畅| 亚洲免费专区| 麻豆成人av在线| 亚洲二区在线| 蜜臀av一区二区在线免费观看 | 男女性色大片免费观看一区二区| 日本亚洲三级在线| 免费在线亚洲欧美| 91精品亚洲| 亚洲欧洲美洲国产香蕉| 国产精品美女午夜爽爽| 色偷偷偷在线视频播放| 免费观看日韩电影| 精品国产一区二区三区性色av| 999久久久91| 日韩三级一区| 日韩欧美看国产| 日韩福利在线观看| 国产成人久久精品麻豆二区 | 亚洲精品乱码久久久久久蜜桃麻豆| 国产精品久久久久久av公交车| 蜜桃成人精品| 欧美一区精品| 色婷婷狠狠五月综合天色拍| 亚洲一二av| 国产日韩欧美在线播放不卡| 在线综合视频| 国产免费播放一区二区| 亚洲天堂1区| 午夜电影一区| 久久精品免视看国产成人| 亚洲激情五月| 麻豆91在线播放| 五月天激情综合网| 麻豆视频观看网址久久| 午夜在线一区二区| 特黄毛片在线观看| 日韩三级精品| 亚洲调教视频在线观看| 久久gogo国模啪啪裸体| 日韩一级不卡| 日本黄色精品| 日本不卡视频一二三区| 久久国产亚洲| 美女久久精品| 人人爽香蕉精品| 神马日本精品| 久久丁香四色| 亚洲一级大片| 影视先锋久久| 国产黄大片在线观看| 日韩中文字幕| 夜夜嗨网站十八久久| 欧美www视频在线观看| 日本不卡视频在线| 欧美在线亚洲| 精品亚洲自拍| 亚洲精品黄色| 婷婷激情综合| 麻豆mv在线观看| 日本久久一区| 亚洲一区国产| 日本久久成人网| 国产成人免费av一区二区午夜| 日韩福利视频导航| av不卡在线看| 国产综合视频| 日韩电影二区| 精品久久国产一区| 国产精品久久久久久久久免费高清| 中文字幕亚洲精品乱码| 9色国产精品| 欧美理论视频| 欧美日韩亚洲在线观看| 日韩a一区二区| 国产精品22p| 国产日韩欧美在线播放不卡| 日韩国产精品久久久| 亚洲精品在线a| 在线视频亚洲欧美中文| 亚洲一区久久| 亚洲综合丁香| 亚洲欧美日韩国产一区| 99视频精品免费观看| 亚洲成人一区| 亚洲精品极品少妇16p| 91精品一区二区三区综合| 中文字幕人成乱码在线观看| 日本一区二区高清不卡| 国产不卡精品在线| 精品久久久中文字幕| 精品国产aⅴ| 精品三级国产| 国产69精品久久| 精品一二三区| 国产欧洲在线| 精品捆绑调教一区二区三区| 亚洲精品国产嫩草在线观看| 午夜精品久久久久久久久久蜜桃| 蜜臀国产一区| 精品免费av在线| 日韩中文影院| 国产综合亚洲精品一区二| 激情欧美一区| 不卡在线一区| 亚洲精品中文字幕乱码| 樱桃成人精品视频在线播放| 国产精品普通话对白| 亚洲一区二区三区在线免费| 亚洲精品免费观看| 日韩高清三区| 久久av影视| 国产理论在线| 五月精品视频| 日本亚洲最大的色成网站www | 国产日产精品一区二区三区四区的观看方式| 日本欧美在线| 国产精品最新| 国内自拍视频一区二区三区| 色偷偷偷在线视频播放| 一区视频在线| 欧美精品中文字幕亚洲专区| 精品深夜福利视频| 亚洲成人国产| 在线一区二区三区视频| 国产一区 二区| 欧美丰满日韩| 狠狠爱成人网| 日本成人在线网站| 久久精品国产成人一区二区三区| 丝袜美腿一区| 在线看片日韩| 久久影院一区二区三区| 精品三级久久| 亚洲午夜免费| 老司机精品在线| 日韩电影免费网址| 石原莉奈一区二区三区在线观看| 欧美日韩xxxx| 午夜av成人| 日韩欧美中文在线观看| 国产精品久久久久久久久久10秀| 91精品91| 国产精品欧美大片| 久久中文字幕二区| 日韩久久99| 日韩在线欧美| 亚洲va久久| 日韩综合一区| 中文精品电影| 日韩理论片av| 日本欧美久久久久免费播放网| 最新中文字幕在线播放| 亚洲精选91| 黑人精品一区| 日本欧美一区二区| 久久蜜桃av| 国产极品一区| 视频一区免费在线观看| 精品国产aⅴ| 中文字幕一区二区三区在线视频| 91亚洲国产高清| 日韩一区二区三免费高清在线观看| 成人在线免费观看网站| 亚洲区第一页|