1. 程式人生 > 其它 >運用Spring AOP和觀察者模式傳送非同步訊息

運用Spring AOP和觀察者模式傳送非同步訊息

在一個元資料專案中,遇到這樣一個需求,一些物件在變更(建立、更新、刪除)的時候除了更新底層資料庫之外還需要通知到第三方系統。

但這個·第三方系統·到底是什麼,目前不確定。

所以我們希望對原有程式碼儘量低侵入,並且給第三方系統留下擴充套件點。

低侵入,我第一個想到的自然是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中監聽到訊息