核心思路是注解标记消费方法→启动扫描注册→消息到达时反射调用。定义@consumer注解声明事件名、异步/超时策略;启动时扫描bean方法并注册至线程安全map;消息到达后按event查处理器列表,反射执行并支持异步提交与异常捕获;补充取消订阅、签名校验及内存泄漏防护。

核心思路是:用注解标记消费方法 → 启动时扫描并注册到事件中心 → 消息到达时反射调用对应方法。
定义统一消费注解
声明一个自定义注解,标明该方法可被订阅、绑定哪个事件名、是否异步执行:
- @Consumer(event = "user.login"):指定监听的事件标识
- 支持属性 like async = true / timeout = 5000:控制执行策略
- 注解保留策略设为 RUNTIME,确保运行期可通过反射读取
启动阶段自动扫描与注册
在框架初始化(如 Spring ContextRefreshedEvent 或自定义启动钩子)中,遍历所有 Bean 的方法,筛选带 @Consumer 注解的方法:
- 提取 event 值作为事件键,方法对象(Method + target 实例)封装为处理器
- 存入线程安全的 Map
>,例如 eventHandlers.put("user.login", handlers) - 若使用类路径扫描,可用
ClassPathScanningCandidateComponentProvider配合条件过滤
消息到达时动态派发
当收到原始消息(如 JSON 字符串或序列化对象),先解析出事件类型,再触发对应回调:
- 根据 event 字段查出所有匹配的 EventHandler 列表
- 对每个 handler,用
method.invoke(target, messagePayload)执行(注意参数类型适配,可加简单转换器) - 若标注 async=true,包装进线程池提交;否则同步执行
- 异常需捕获并记录,避免阻塞后续 handler
补充关键细节
实际落地时容易忽略但影响稳定性:
- 取消订阅支持:提供
unsubscribe(Class, String)方法,从注册表中移除指定类的某事件处理器 - 事件类型校验:建议在注册阶段检查方法签名,只接受单参(消息体)或双参(消息体 + Metadata)形式
- 避免内存泄漏:若 target 是非单例对象,需考虑弱引用或生命周期绑定,防止长期持有 Activity/Controller 实例











