運用Spring AOP和觀察者模式傳送非同步訊息
阿新 • • 發佈:2022-05-23
在一個元資料專案中,遇到這樣一個需求,一些物件在變更(建立、更新、刪除)的時候除了更新底層資料庫之外還需要通知到第三方系統。
但這個·第三方系統·到底是什麼,目前不確定。
所以我們希望對原有程式碼儘量低侵入,並且給第三方系統留下擴充套件點。
低侵入,我第一個想到的自然是AOP
首先我們定義一個註解,它代表一個切入點,所有被這個註解標註的方法,都是我們要監聽訊息的方法。
@Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface EventPoint { }
接下來,我們定義真正的AOP邏輯,真實程式碼不多,我們只監聽對應方法的引數。將之作為訊息傳送出去
@Slf4j @Component @Aspect public class EventPost { @Pointcut("@annotation(cc.eslink.metadata.observer.EventPoint)") public void ServiceAspect(){} @Autowired private EventBus eventBus; @After("ServiceAspect()") public void after(JoinPoint joinPoint) { Object[] args= joinPoint.getArgs(); Object arg = args[0]; eventBus.post(arg); } }
訊息匯流排我們想到了guava中的eventbus,定義一個EventObserver類,並將它作為監聽者註冊到EventBus。
@Component @Slf4j public class EventObserver { /** * 監聽Metadata變更 * @param metadata */ @Subscribe public void metadataObserver(Metadata metadata){ log.info("event:"+metadata); } /** * 監聽Schema變更 * @param schemas */ @Subscribe public void schemaObserver(List<Schema> schemas){ log.info("event:"+schemas.toString()); } } // @Component public class EventBusConfig { @Autowired private EventObserver eventObserver; @Bean public EventBus eventBus() { EventBus eventBus = new EventBus(); eventBus.register(eventObserver); return eventBus; } }
接下來的事情就很簡單了,在需要監聽的方法上寫上EventPoint註解,即可在EventObserver中監聽到訊息