自己做网站还是开淘宝,wordpress代码运行插件吗,建设公司网站需要多少钱,石家庄互联网公司有哪些文章目录 事件监听驱动 与 异步事件源ApplicationContextAware接口 发布事件事件实体监听事件实现异步注入綫程池 事件驱动机制#xff0c;与MQ消息队列比较 事件监听驱动 与 异步 事件监听驱动优点#xff1a;解耦#xff0c;将 事件和业务进行解耦#xff0c;通过Asyc注解… 文章目录 事件监听驱动 与 异步事件源ApplicationContextAware接口 发布事件事件实体监听事件实现异步注入綫程池 事件驱动机制与MQ消息队列比较 事件监听驱动 与 异步 事件监听驱动优点解耦将 事件和业务进行解耦通过Asyc注解可以实现异步 事件监听驱动优点解耦将 事件和业务进行解耦通过Asyc注解可以实现异步
我们监听事件之前要有事件源source事件Event发布事件publishEvent然后才能到监听事件。
事件驱动机制是观察者模式称发布订阅具体实现事件对象Event相当于被观察对象(Subject), 事件监听(EventListener) 相当于观察者(Observer)
事件源
实现ApplicationContextAware接口 重写setApplicationContext方法 获取ApplicationContext对象
public class FilePhysicalDeleteEventListener implements ApplicationContextAware {private ApplicationContext applicationContext;Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext applicationContext;}
}ApplicationContextAware接口 ApplicationContext作用具体参考 https://blog.csdn.net/Pluto372/article/details/130139628 在Spring/SpringMVC中我们拿到IOC容器无非有三种方式那就是使用ApplicationContext接口下的三个实现类ClassPathXmlApplicationContext、FileSystemXmlApplicationContext、AnnotationConfigApplicationContext。 但是SpringBoot的强大让我们无需再配置xml文件也因此我们无法通过上述方式拿到ApplicationContext对象所以当在项目需要用到spring中的bean对象时一般做法就是实现ApplicationContextAware接口通过这个接口就可以获取到ApplicationContext对象进入从ApplicationContext中获取所需要bean对象。 总结通过ApplicationContextAware接口获取ApplicationContext对象ApplicationContext可以获取IOC容器中的bean 发布事件 通过ApplicationContext对象发布 private void physicalDeleteFileByStorageEngine(ListRPanFile realFileRecords) {//映射为路径集合ListString realFilePathList realFileRecords.stream().map(RPanFile::getRealPath).collect(Collectors.toList());DeleteFileContext context new DeleteFileContext();context.setRealFilePathList(realFilePathList);try {storageEngine.delete(context);} catch (IOException e) {//记录错误日志applicationContext.publishEvent(new ErrorLogEvent(this, 实体文件 JSON.toJSONString(realFilePathList) 物理删除失败请执行手动删除, RPanConstants.ZERO_LONG));}}事件实体 事件实体需要继承ApplicationEvent对象 Getter
Setter
EqualsAndHashCode
ToString
public class ErrorLogEvent extends ApplicationEvent {/*** 错误日志的内容*/private String errorMsg;/*** 当前登录的用户ID*/private Long userId;public ErrorLogEvent(Object source, String errorMsg, Long userId) {super(source);this.errorMsg errorMsg;this.userId userId;}
}监听事件 注解EventListener(ErrorLogEvent.class)方式监听事件 Component
public class ErrorLogEventListener {Autowiredprivate IErrorLogService iErrorLogService;/*** 监听系统错误日志事件并保存到数据库中** param event*/EventListener(ErrorLogEvent.class) //监听这个事件Async(value eventListenerTaskExecutor)public void saveErrorLog(ErrorLogEvent event){RPanErrorLog record new RPanErrorLog();//保存到数据库调用mp 方法iErrorLogService.save(record);}
}实现异步
实现异步并指定线程池任务执行器value 为指定线程池执行器的 bean的名称。 Async(value “eventListenerTaskExecutor”) 当 ErrorLogEvent 事件发生时相关的处理方法将会以异步的方式执行 并且将使用指定的任务执行器 “eventListenerTaskExecutor”。不阻塞主线程提高响应。 public class ErrorLogEventListener {Autowiredprivate IErrorLogService iErrorLogService;/*** 监听系统错误日志事件并保存到数据库中** param event*/EventListener(ErrorLogEvent.class) //监听这个事件Async(value eventListenerTaskExecutor)public void saveErrorLog(ErrorLogEvent event){RPanErrorLog record new RPanErrorLog();//保存到数据库调用mp 方法iErrorLogService.save(record);}
}注入綫程池
通过Configuration注解和Bean注解以配置类的方式注入线程池 通过name属性指定bean的名称
SpringBootConfiguration
public class TreadPoolConfig {// 注入bean// 任务线程池执行器Bean(name eventListenerTaskExecutor)public ThreadPoolTaskExecutor eventListenerTaskExecutor(){ThreadPoolTaskExecutor taskExecutor new ThreadPoolTaskExecutor();
// new FutureTask();taskExecutor.setCorePoolSize(10);taskExecutor.setMaxPoolSize(10);taskExecutor.setKeepAliveSeconds(200);taskExecutor.setQueueCapacity(2048);taskExecutor.setThreadNamePrefix(event-listener-thread);//拒绝策略// CallerRunsPolicy 既不抛弃任务也不抛出异常直接使用主线程来执行此任务// abort 直接拒绝并抛异常// discard 丢弃不抛出异常// discardEldest 抛弃队列中等待最久的taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());return taskExecutor;}
}事件驱动机制与MQ消息队列比较 MQ驱动的作用解耦、异步、削峰 优点解耦异步削峰消息不丢失解决高并发消息 缺点难维护 事件驱动机制解耦、异步做不到削峰。 优点维护简单 缺点大并发扛不住适合单机环境消息可能丢失无法削峰 总结MQ的优点
异步解耦应对高并发的消息适用于分布式环境消息不丢失对消息进行 削峰
总结MQ的缺点
分布式场景下引发的复杂问题如分布式事务等。