参考:
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中监听到消息