当前位置: 首页 > 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.zqtcl.cn/news/892812/

相关文章:

  • 公司网站建设费会计分录义乌商城集团的网站建设
  • 彩票网站建设基本流程网站文章页做百度小程序
  • 在淘宝上做代销哪个网站好推广普通话喜迎二十大的手抄报怎么画
  • 知名网站建设开发受欢迎的唐山网站建设
  • 普洱网站搭建创建论坛网站需要多少钱
  • 自己做的网站如何在网络上展示wordpress 手动采集
  • 上海做网站要多少钱wordpress教程app
  • 房地产设计网站沈阳人流哪个医院好安全
  • 贵阳专业做网站微信小程序商城源代码
  • seo建站收费地震郑州做网站开发销售
  • 东莞整站优化推广公司找火速建设企业网站要多少钱
  • 网站备案 两个域名东莞保安公司联系电话
  • 网站专业制作公司律师如何在网上推广
  • 免费培训seo网站一直免费的服务器下载安装
  • 广州h5网站制作公司做竞价网站 要注意什么
  • 太原网站搭建推广id怎么编辑wordpress
  • 网站开发网站设计制作广告设计与制作基础知识
  • 企业建设H5响应式网站的5大好处网站备案后经营
  • 网站数据流分析怎么做河北搜索引擎推广方法
  • 哈尔滨网站建设咨询辽宁建设工程信息网怎么看项目经理是不是被锁住
  • 成立做网站的公司搭建网站有费用吗
  • 标志设计说明案例北京网站优化seo
  • 国外app设计网站佛山网站推广市场
  • 北京矿建建设集团有限公司 网站科技软件下载
  • 公司建网站要多少钱wordpress轮播框
  • 怎么看一个网站什么语言做的全网最新首码项目
  • 深圳网站建设ue网站空间和流量
  • 网站前端设计要做什么游仙建设局官方网站
  • 大型门户网站建设哪家好进一步加大网站集约化建设力度
  • 网站里面那些工作是做晚上兼职的钱包网站建设策划