运用Spring AOP和观察者模式发送异步消息

参考:

https://www.jianshu.com/p/3605d057e763

 

在一个元数据项目中,遇到这样一个需求,一些对象在变更(创建、更新、删除)的时候除了更新底层数据库之外还需要通知到第三方系统。

但这个·第三方系统·到底是什么,目前不确定。

所以我们希望对原有代码尽量低侵入,并且给第三方系统留下扩展点。

低侵入,我第一个想到的自然是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中监听到消息

posted @ 2022-05-23 13:44  Mars.wang  阅读(189)  评论(0编辑  收藏  举报