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

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

詳解基于Spring Data的領域事件發(fā)布

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

領域事件發(fā)布是一個領域?qū)ο鬄榱俗屍渌鼘ο笾雷约阂呀?jīng)處理完成某個操作時發(fā)出的一個通知,事件發(fā)布力求從代碼層面讓自身對象與外部對象解耦,并減少技術代碼入侵。

一、 手動發(fā)布事件

// 實體定義@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); // 事件發(fā)布 applicationEventPublisher.publishEvent(new DepartmentEvent(department)); }}

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

二、 自動發(fā)布事件

// 實體定義@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()); } // 事件發(fā)布后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定義事件發(fā)布后的回調(diào)。

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

三、 事件監(jiān)聽

@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監(jiān)聽事件

@EventListener沒有事務支持,只要事件發(fā)出就可監(jiān)控到

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

上述情況會造成事務失敗回滾,但事件監(jiān)控端已經(jīng)執(zhí)行,可能導致數(shù)據(jù)不一致的情況發(fā)生

2. 使用@TransactionalEventListener監(jiān)聽事件

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

使用TransactionPhase.AFTER_COMMIT可在事務完成后,再執(zhí)行事件監(jiān)聽方法,從而保證數(shù)據(jù)的一致性

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)執(zhí)行成功后才會發(fā)送事件,故AFTER_ROLLBACK方法只會在同一事務中其它語句執(zhí)行失敗或顯式rollback時才會執(zhí)行,如果save方法執(zhí)行失敗,將不會監(jiān)聽到回滾事件。

4. @Async異步事件監(jiān)聽

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

四、 總結

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

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

五、 源碼

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

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

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩精品水蜜桃| 国产一区清纯| 亚洲欧美视频一区二区三区| 国产尤物精品| 老牛影视一区二区三区| 亚洲免费成人av在线| 91精品丝袜国产高跟在线| 麻豆国产一区| 久久精品99久久无色码中文字幕| 欧美a级一区二区| 国产精品1luya在线播放| 国产a久久精品一区二区三区| 麻豆视频在线看| 免费看av不卡| 国产亚洲精品v| 欧美日本二区| 久久高清精品| 亚洲精品成人一区| 精品三级在线观看视频| 黄色成人91| 国产精品久久久久久久久久白浆| 人人精品亚洲| 国产亚洲毛片| 91精品国产自产精品男人的天堂| 欧美日一区二区| 久久福利影视| 国产精品1区在线| 欧美日韩一二三四| 日韩高清在线观看一区二区| 日韩1区在线| 中文字幕成人| 高清av不卡| 亚洲精品系列| 国产精品亚洲一区二区三区在线观看| 欧美日韩1区| 欧美xxxx中国| 亚洲一区二区毛片| 国产精品sm| 日韩午夜av在线| 国模大尺度视频一区二区| 亚洲资源av| 国产不卡人人| 亚洲专区视频| 伊人久久一区| 欧美成a人片免费观看久久五月天| 日韩精品三级| 国产成年精品| 老牛国内精品亚洲成av人片| 婷婷成人av| 日本在线不卡视频| 欧美久久久网站| 中文字幕人成乱码在线观看| 肉色欧美久久久久久久免费看| 国产成人精品福利| 久久a爱视频| 影音国产精品| 国产精品亚洲欧美一级在线| 亚洲深夜影院| 欧美日韩1区| 97精品国产一区二区三区| www.九色在线| 蜜臀av一区二区在线免费观看 | 蜜桃一区二区三区在线| 日韩中出av| 日韩在线观看| 亚洲h色精品| 欧美另类中文字幕| 好看的av在线不卡观看| 国产精品一页| 亚洲欧美久久精品| 欧美1区2区3区| 欧美精品日日操| 精品亚洲二区| 亚洲精品进入| 视频一区二区三区在线| 亚洲a一区二区三区| 欧美国产另类| 国产区精品区| 国产日韩一区二区三区在线| 综合在线一区| 日韩精品久久久久久| 日韩中文av| 欧美亚洲免费| 久久精品97| 久久精品超碰| 国产欧美亚洲一区| 国产精品久久久久久久久久白浆 | 国产精品午夜一区二区三区| 亚洲一区日韩在线| 99riav1国产精品视频| 亚洲天堂成人| 亚洲激情中文| 亚洲专区一区| 一区二区三区国产盗摄| 亚洲精品亚洲人成在线观看| 蜜臀av国产精品久久久久| 国产欧美一区二区三区精品酒店| 亚洲国产一区二区三区在线播放 | 精品国产一级| 国产精品jk白丝蜜臀av小说| 久久久国产精品入口麻豆| 久久免费福利| 国产精品国产一区| 久久婷婷一区| 亚洲一区成人| 亚洲久久一区| 日韩不卡一区二区| 国产精品久久久久毛片大屁完整版| 久久一级电影| 国产伊人精品| 欧美激情麻豆| 欧美日韩一二三四| 国产精品美女在线观看直播| 亚洲欧美一级| 青青草91久久久久久久久| 91精品精品| 最近国产精品视频| 欧美午夜精彩| 亚洲精品免费观看| 视频一区二区不卡| 91大神在线观看线路一区| 国产精品久久久久久久久久久久久久久| 久久av免费看| 国产欧美日韩在线一区二区| 免费一级欧美片在线观看网站| 在线看片不卡| 一区二区91| 日韩.com| 快she精品国产999| 欧美一区二区三区久久精品| 美女久久久久久| 不卡中文一二三区| 日本午夜精品久久久| 成人污污视频| 黄色成人精品网站| 国产日韩免费| 欧美日韩视频免费观看| 日韩中文字幕区一区有砖一区 | 中文一区在线| 日本在线视频一区二区| 成人精品高清在线视频| 日韩视频一区| 免费看久久久| 国产午夜精品一区二区三区欧美| 神马午夜久久| 综合激情网站| 桃色av一区二区| 石原莉奈在线亚洲三区| 国产精品一站二站| 影音先锋国产精品| 国产黄色精品| 黑丝一区二区三区| 精品亚洲a∨| 亚洲精品第一| 久久久久久久久99精品大| 欧美一级二区| 日韩avvvv在线播放| 国产精品va视频| 激情六月综合| 91欧美精品| 高清一区二区| 久久一区二区三区电影| 在线观看亚洲精品福利片| 色8久久久久| 亚洲一区日本| 国产传媒av在线| 日本久久一区| 欧美日韩精品免费观看视频完整| 亚洲综合电影一区二区三区| 好吊日精品视频| 久久精品国产一区二区| 日韩精品一卡二卡三卡四卡无卡| 青青青国产精品| 国产欧美日韩精品高清二区综合区 | 蜜桃视频一区二区| 国产精品白浆| 精品三级在线观看视频| 伊人精品一区| 狠狠久久伊人中文字幕| 日韩国产一二三区| 美女精品一区| 亚洲国产不卡| 免费欧美一区| 97精品国产| 免费一级欧美片在线观看网站| 日本欧美久久久久免费播放网| 亚洲免费影视| 亚洲电影有码| 最近高清中文在线字幕在线观看1| 成人片免费看| 国产精品亚洲一区二区在线观看 | 亚洲精品小说| 精品国产18久久久久久二百| 国产精品自拍区| 欧美亚洲免费| 日韩中出av| 婷婷综合一区| 日韩av成人高清| 国产日产精品_国产精品毛片| 精品亚洲精品|