当前位置: 首页 > news >正文

端端网站开发领地免费网站

端端网站开发,领地免费网站,建筑设计网址大全,网上智慧团建官网ApplicationEvent以及Listener是Spring为我们提供的一个事件监听、订阅的实现#xff0c;内部实现原理是观察者设计模式#xff0c;设计初衷也是为了系统业务逻辑之间的解耦#xff0c;提高可扩展性以及可维护性。事件发布者并不需要考虑谁去监听#xff0c;监听具体的实现…ApplicationEvent以及Listener是Spring为我们提供的一个事件监听、订阅的实现内部实现原理是观察者设计模式设计初衷也是为了系统业务逻辑之间的解耦提高可扩展性以及可维护性。事件发布者并不需要考虑谁去监听监听具体的实现内容是什么发布者的工作只是为了发布事件而已。 创建Event事件 public class MessageEvent extends ApplicationEvent {/*** 消息体*/private MessageDTO messageDTO;/*** Create a new ApplicationEvent.** param source the object on which the event initially occurred (never {code null})*/public MessageEvent(MessageDTO source) {super(source);this.messageDTO source;}public MessageDTO getMessageDTO() {return messageDTO;} } 我们自定义事件MessageEvent继承了ApplicationEvent继承后必须重载构造函数构造函数的参数可以任意指定其中source参数指的是发生事件的对象该对象可以在监听内被获取。 在Spring内部中有多种方式实现监听如EventListener注解、实现ApplicationListener泛型接口、实现SmartApplicationListener接口等我们下面来讲解下这三种方式分别如何实现。 创建MessageDTO public class MessageDTO {/*** 消息类型*/private MsgTypeEnum msgType;/*** 消息发出时的时间戳*/private Long syncTime; } 事件发布 Service public class UserService {AutowiredApplicationContext applicationContext;public void register(){//../省略其他逻辑//发布事件applicationContext.publishEvent(new MessageEvent(new MessageDTO()));} } 事件发布是由ApplicationContext对象管控的我们发布事件前需要注入ApplicationContext对象调用publishEvent方法完成事件发布。 实现监听 EventListener Service public class MessageEventService {EventListenerpublic void notify(MessageEvent messageEvent) {log.info(异步发送消息体:{}, JSON.toJSONString(messageEvent));} } ApplicationListener Component public class RegisterListener implements ApplicationListenerMessageEvent {/*** 实现监听*/Overridepublic void onApplicationEvent(MessageEvent messageEvent) {} } SmartApplicationListener实现有序监听 Component public class UserRegisterListener implements SmartApplicationListener {/*** 该方法返回truesupportsSourceType同样返回true时才会调用该监听内的onApplicationEvent方法* param aClass 接收到的监听事件类型* return*/Overridepublic boolean supportsEventType(Class? extends ApplicationEvent aClass) {//只有MessageEvent监听类型才会执行下面逻辑return aClass MessageEvent.class;}/*** 该方法返回truesupportsEventType同样返回true时才会调用该监听内的onApplicationEvent方法* param aClass* return*/Overridepublic boolean supportsSourceType(Class? aClass) {//只有在UserService内发布的MessageEvent事件时才会执行下面逻辑return aClass UserService.class;}/*** supportsEventType supportsSourceType 两个方法返回true时调用该方法执行业务逻辑* param applicationEvent 具体监听实例这里是UserRegisterEvent*/Overridepublic void onApplicationEvent(ApplicationEvent applicationEvent) {//转换事件类型MessageEvent messageEvent (MessageEvent) applicationEvent;}/*** 同步情况下监听执行的顺序* return*/Overridepublic int getOrder() {return 0;} } SmartApplicationListener接口继承了全局监听ApplicationListener并且泛型对象使用的ApplicationEvent来作为全局监听可以理解为使用SmartApplicationListener作为监听父接口的实现监听所有事件发布。 既然是监听所有的事件发布那么SmartApplicationListener接口添加了两个方法supportsEventType、supportsSourceType来作为区分是否是我们监听的事件只有这两个方法同时返回true时才会执行onApplicationEvent方法。 可以看到除了上面的方法还提供了一个getOrder方法这个方法就可以解决执行监听的顺序问题return的数值越小证明优先级越高执行顺序越靠前。 如果说我们不希望在执行监听时等待监听业务逻辑耗时发布监听后立即要对接口或者界面做出反映我们该怎么做呢 使用Async实现异步监听 Aysnc其实是Spring内的一个组件可以完成对类内单个或者多个方法实现异步调用这样可以大大的节省等待耗时。内部实现机制是线程池任务ThreadPoolTaskExecutor通过线程池来对配置Async的方法或者类做出执行动作。 线程任务池配置 我们创建一个ListenerAsyncConfiguration并且使用EnableAsync注解开启支持异步处理具体代码如下所示 Configuration EnableAsync public class ListenerAsyncConfiguration implements AsyncConfigurer {/*** 获取异步线程池执行对象* return*/Overridepublic Executor getAsyncExecutor() {//使用Spring内置线程池任务对象ThreadPoolTaskExecutor taskExecutor new ThreadPoolTaskExecutor();//设置线程池参数taskExecutor.setCorePoolSize(5);taskExecutor.setMaxPoolSize(10);taskExecutor.setQueueCapacity(25);taskExecutor.initialize();return taskExecutor;}Overridepublic AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {return null;} } 我们自定义的监听异步配置类实现了AsyncConfigurer接口并且实现内getAsyncExecutor方法以提供线程任务池对象的获取。 我们只需要在异步方法上添加Async注解就可以实现方法的异步调用 Service public class MessageEventService {EventListenerAsyncpublic void notify(MessageEvent messageEvent) {log.info(异步发送消息体:{}, JSON.toJSONString(messageEvent));} }
http://www.dnsts.com.cn/news/18362.html

相关文章:

  • 网站业务功能设计阿里云服务器做盗版电影网站
  • 南昌网站制作代理商python手机在线编程
  • 建设网站用什么小米网站 用什么做的
  • 托育项目建设背景及必要性医疗网站优化
  • 阿里巴巴网站建设目的网站开发项目进度安排
  • 怎么在中国做网站网站涿鹿县建设局网站
  • 网站源码上传到哪个文件夹酷家乐软件下载电脑版
  • 温州建站方案seo关键词排名系统
  • 图列说明网站开发的流程宁波网站制作首荐荣盛网络好
  • 企业网站的必要性宣传页在线设计软件
  • 做营销型网站的教程推广公司的网站可以采取哪些方式
  • 西部网站管理助手flash网站用什么做
  • 做网站需要会什么 知乎wordpress搜索框选择分类
  • 龙游县住房和城乡建设局网站wordpress 屏蔽ftp
  • 焦作专业做网站公司个人网站前置审批项
  • 天门网站网站建设简单的静态网站
  • 优化网站方法vue小程序开发教程
  • 简单详细搭建网站教程视频网站后台插件下载
  • 泉州网站建设案例网站备案容易通过吗
  • 德成建设集团有限公司网站wordpress 后台添加文章 没编辑功能
  • 大连 响应式网站公益机构网站建设方案
  • 网站建设的几点体会网站诊断方法
  • 百度收录不了网站怎样在中国建设银行网站开通短信提醒
  • 泉州专业网站制作定制石家庄中企动力
  • 本网站只做信息展示不提供在线交易网络公司门头
  • 行政机关单位网站建设轻创优选地推app
  • 怀柔建设网站百度seo排名优化如何
  • 网站keywords标签怎么写广州制作网站公司哪家好
  • 海宁网站建设公司推荐代码生成器属于什么工具
  • 贵阳网站建设zu97慈溪网站建设网站推广