面試官:不用訊息佇列 MQ等中介軟體,還能如何實現釋出訂閱?

面試官:不用訊息佇列 MQ等中介軟體,還能如何實現釋出訂閱?

快到金九銀十的季節,@Python大星 的好友小強子準備跳槽實現薪資翻倍,在一次面試中,面試官出了這麼一道題:不使用 Redis 和 訊息佇列如何實現訂閱釋出,主業務和子業務解耦?

面試官:不用訊息佇列 MQ等中介軟體,還能如何實現釋出訂閱?

我們見到的業務可能是這樣的(以下為虛擬碼)

面試官:不用訊息佇列 MQ等中介軟體,還能如何實現釋出訂閱?

問題:每次下單需要加新功能(如增加積分、增加抽獎機會),則要修改原有的類,難以維護。

可以使用 Spring 監聽器之 ApplicationListener 來實現。

面試官:不用訊息佇列 MQ等中介軟體,還能如何實現釋出訂閱?

1、

訂單建立活動事件

面試官:不用訊息佇列 MQ等中介軟體,還能如何實現釋出訂閱?

2、建立監聽器

① 簡訊監聽器

面試官:不用訊息佇列 MQ等中介軟體,還能如何實現釋出訂閱?

② 微信監聽器

面試官:不用訊息佇列 MQ等中介軟體,還能如何實現釋出訂閱?

3、事件釋出

面試官:不用訊息佇列 MQ等中介軟體,還能如何實現釋出訂閱?

面試官:不用訊息佇列 MQ等中介軟體,還能如何實現釋出訂閱?

看到這裡,有沒有發現和訊息佇列的思路一樣,applicationContext.publishEvent(orderCreateEvent); 相當於生產者釋出訊息,而 SmsListener 相當於消費者去消費訊息。

面試官:不用訊息佇列 MQ等中介軟體,還能如何實現釋出訂閱?

核心原始碼

從原始碼中我們可以看到,如果有 Executor,可以支援使用 Executor 進行非同步派發;Executor executor = getTaskExecutor(); 否則,同步的方式(預設)直接執行 listener 方法;invokeListener (listener, event);拿到 listener 回撥 onApplicationEvent 方法;

SpringBoot 開啟非同步監聽

1、在啟動類上加上@ EnableAsync 註解

面試官:不用訊息佇列 MQ等中介軟體,還能如何實現釋出訂閱?

2、監聽類

在方法上增加 @Async 註解

面試官:不用訊息佇列 MQ等中介軟體,還能如何實現釋出訂閱?

SmsAsyncListener 類

面試官:不用訊息佇列 MQ等中介軟體,還能如何實現釋出訂閱?

WechatAsyncListener

歡迎關注 @Python 大星 ,一個會點 Python 的 Java 程式設計師。如果你有更好的想法,歡迎留言,一起探討,想說你就說啊!後面繼續分享 Java 的相關開發,人少就散了吧!@Python 大星

@Python 大星 | 文

面試官:不用訊息佇列 MQ等中介軟體,還能如何實現釋出訂閱?