用注解的方式 实现 spring could 的事件驱动
这是我第一篇博客 写的不好请大家谅解
sc中的事件信息 是以event实现的,简单就是通过各种注解来实现 主业务外的逻辑处理
1、首先 我们要创建一个Event 来缺定是哪个驱动事件
/** * <p></p> * * @author Created by Chenbaoliang on 2018/6/22. * @version V1.0 * @ClassName MsgEvent * @Description TODO * @modificationHistory=========================逻辑或功能性重大变更记录 * @modify by user: Chenbaoliang on 2018/6/22. * @modify by reason:{方法名}:{原因} */ public class MsgEvent extends ApplicationEvent { public MsgEvent(String source) { super(source); } }
这就是我们第一个事件 其中声明的MsgEvent 是我们自己的 要继承 spring 提供的 ApplicationEvent 这是框架默认提供的一个抽象基类,类的继承结构是
在生成自己的msgEvent时 要重写 构造方法及
注意 source 不能为空 source的类型是 object 的 我这只是业务需要 所以定义成 String
2.有了自己的 Event 就可以在业务上用了
首先 我们先在主业务逻辑 中添加声明 事件什么时候处理
例如 我在controller 中 有一个需要处理的 次要逻辑 可以这样@Autowired private ApplicationEventPublisher applicationEventPublisher; @Autowired private IAgreementCommService agreementCommService; @ApiVersion(value = VersionConstant.VERSION200) @PostMapping(value = "/auth/agreeToSign") public JSONObject agreeToSign(@PathVariable(value = "version") String version, @RequestParam(value = "agreementId") String agreementId, @RequestParam(value = "fileIdList") String fileIdList, @RequestParam(value = "ticketProvider",required = false,defaultValue = "-1") Integer ticketProvider) { try { if (jsonObject.get("code").equals(10000)) { ReqProject reqProject = reqprojectService.selectById(Long.parseLong(agreement.getProjectId())); Map<String, String> map = new HashedMap(); String uuid = UUIDUtil.getUUID(); Msg msg = new Msg(); //省略 String jsMsg = JSONObject.toJSONString(msg); applicationEventPublisher.publishEvent(new MsgEvent(jsMsg)); } return jsonObject; } catch (Exception e) { logger.error("同意签署失败",e); return JsonUtil.getFailJsonObject(AgreementErrorCode.AGREEMENT_30001,AgreementErrorCode.AGREEMENT_INFO_30001); } }
关键是在controller 中注入 applicationEventPublisher spring提供的事件发布器,他有两个方法 一个是 publishEvent(<?> extends ApplicationEvent) 的方法 提供事件发布 这样我们的事件 就发布成功了 当然 我们一样需要一个 监听器 监听事件发布后的处理
3、创建事件 监听器 监听事件
@Component public class MsgEventListener { private static Logger logger = Logger.getLogger(MsgEventListener.class); @EventListener public void listenerMsgSend(MsgEvent event) { String source = event.getSource().toString(); logger.info("===================事件监听发送消息" + source); JSONObject jsonObject = chatFeign.imLogin("v200", source); logger.info(jsonObject); }
这就是我们写的事件监听器 简单吧 只需要一个 @EventListener 方法注解 就能监听我们发布的 msgEvent;
这就是一个简单的demo 当然也可以有多中写的方式 我这只是写了一种 望各位大佬 批评指正 。
而且这种事件监听是无法满足分布式业务的需求的,而且不能 指定 事件的处理顺序 ,这也是缺点。
谢谢大家