快到金九銀十的季節,@Python大星 的好友小強子準備跳槽實現薪資翻倍,在一次面試中,面試官出了這麼一道題:不使用 Redis 和 訊息佇列如何實現訂閱釋出,主業務和子業務解耦?
我們見到的業務可能是這樣的(以下為虛擬碼)
問題:每次下單需要加新功能(如增加積分、增加抽獎機會),則要修改原有的類,難以維護。
可以使用 Spring 監聽器之 ApplicationListener 來實現。
1、
訂單建立活動事件
2、建立監聽器
① 簡訊監聽器
② 微信監聽器
3、事件釋出
看到這裡,有沒有發現和訊息佇列的思路一樣,applicationContext.publishEvent(orderCreateEvent); 相當於生產者釋出訊息,而 SmsListener 相當於消費者去消費訊息。
核心原始碼
從原始碼中我們可以看到,如果有 Executor,可以支援使用 Executor 進行非同步派發;Executor executor = getTaskExecutor(); 否則,同步的方式(預設)直接執行 listener 方法;invokeListener (listener, event);拿到 listener 回撥 onApplicationEvent 方法;
SpringBoot 開啟非同步監聽
1、在啟動類上加上@ EnableAsync 註解
2、監聽類
在方法上增加 @Async 註解
SmsAsyncListener 類
WechatAsyncListener
歡迎關注 @Python 大星 ,一個會點 Python 的 Java 程式設計師。如果你有更好的想法,歡迎留言,一起探討,想說你就說啊!後面繼續分享 Java 的相關開發,人少就散了吧!@Python 大星
@Python 大星 | 文