运用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中监听到消息
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端