用注解的方式 实现 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  当然也可以有多中写的方式 我这只是写了一种  望各位大佬 批评指正  。

而且这种事件监听是无法满足分布式业务的需求的,而且不能  指定 事件的处理顺序  ,这也是缺点。

谢谢大家