配置类中添加 @EnableAsync开启对异步任务的支持,
并在相应的方法中使用 @Async注解来声明一个异步任务
Environment 可以直接获取配置文件的值

@Configuration
@EnableAsync
public class TaskExecutorConfig {/**** 创建异步任务执行线程池* @return*/@Bean("taskExecutor")public TaskExecutor getAsyncExecutor(Environment env) {ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();taskExecutor.setMaxPoolSize(Integer.valueOf(env.getProperty("spring.asyn.max.size")));taskExecutor.setCorePoolSize(Integer.valueOf(env.getProperty("spring.asyn.core.size")));taskExecutor.setQueueCapacity(Integer.valueOf(env.getProperty("spring.asyn.queue.size")));taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());taskExecutor.initialize();return taskExecutor;}}

线程池已满的拒绝策略

RejectedExecutionHandler handler =new ThreadPoolExecutor.DiscardPolicy();taskExecutor.setRejectedExecutionHandler(handler);
AbortPolicy         -- 当任务添加到线程池中被拒绝时,它将抛出 RejectedExecutionException 异常。
CallerRunsPolicy    -- 当任务添加到线程池中被拒绝时,会在线程池当前正在运行的Thread线程池中处理被拒绝的任务。
DiscardOldestPolicy -- 当任务添加到线程池中被拒绝时,线程池会放弃等待队列中最旧的未处理任务,然后将被拒绝的任务添加到等待队列中。
DiscardPolicy       -- 当任务添加到线程池中被拒绝时,线程池将丢弃被拒绝的任务。

定义一个事件

/*** @desc 定义监听事件* @author  yule* @create  2019/1/25**/
public class ContentEvent extends ApplicationEvent {//消息体,需要异步处理的数据private ScanData content;public ContentEvent(Object source, ScanData content){super(source);this.content = content;}public ScanData getData(){return content;}
}

监听事件,异步处理

/*** @desc 监听事件* @author  yule* @create  2019/1/25**/
@Component
public class ContentListener implements ApplicationListener<ContentEvent> {@Async@Overridepublic void onApplicationEvent(ContentEvent contentEvent) {ScanData a = contentEvent.getData();int b=0;for(int i=0;i<10000;i++){b=i+b;}System.out.println(Thread.currentThread().getName()+a.toString());}
}

测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class TestThread {@Autowiredprivate ApplicationContext applicationContext;@Testpublic void handler(){Long start=System.currentTimeMillis();for(int i=1;i<100;i++){ScanData a = new ScanData();a.setDoc_id(i);a.setProductName("aa"+i);ContentEvent event = new ContentEvent("aa", a);applicationContext.publishEvent(event);}Long end=System.currentTimeMillis();System.out.println("处理完毕:"+(end-start));}}

观察者模式ApplicationListener异步处理事件相关推荐

  1. 精讲23种设计模式-基于观察者模式~设计异步多渠道群发框架

    文章目录 一.观察者模式 1. 观察者模式基本概念 2. 观察者模式的应用场景 3. 观察者模式的类图 二.设计异步多渠道群发框架 2.1. 定义消息观察者抽象接口 2.2. 创建观察者 2.3. 主 ...

  2. @TransactionalEventListener与@Async实现事务提交后异步处理事件

    @Aync是通过AsyncAnnotationBeanPostProcessor来处理.其在setBeanFactory会设置AsyncAnnotationAdvisor,其代码如下 public v ...

  3. Netty异步非阻塞事件驱动及组件原理详解

    本文基于 Netty 4.1 展开介绍相关理论模型,使用场景,基本组件.整体架构,知其然且知其所以然,希望给大家在实际开发实践.学习开源项目方面提供参考. Netty 是一个异步事件驱动的网络应用程序 ...

  4. 蘑菇街java,猎聘邀请蘑菇街觉知分享Java异步化与高性能网络应用

    据悉,不久前,国内最大的精英职业发展平台猎聘,在杭州沃创空间的沃创咖啡厅举办了一场"大神教你Java新技术"的线下分享会,拥有近十年互联网研发经验的大咖觉知把多年私藏的干货分享给了 ...

  5. 异步神器:CompletableFuture实现原理和使用场景

    点击下方"IT牧场",选择"设为星标" 来源:blog.csdn.net/weixin_39332800/article/details/108185931 1 ...

  6. ajax异步请求,以及ajax异步返回的数据的处理方案

    为什么JS会有同步任务和异步任务: js是单线程,会按照顺序执行一个一个的任务,如果遇到某个任务像网络请求一类的需要延长执行回调函数,那么页面就会阻塞,所以引入了异步的概念. 同步任务:同步任务不需要 ...

  7. 【设计模式】观察者模式:一个注册功能也能使用到设计模式?

    人生在世如身处荆棘之中,心不动,人不妄动,不动则不伤,如心动则人妄动,伤其身,痛其骨,于是体会到世间诸般痛苦 目录 我的斗罗梦 悲催的小明 什么是观察者模式? 注册功能改造 异步非阻塞观察者模式 Ev ...

  8. EventBus VS Spring Event

    EventBus VS Spring Event 本地异步处理,采用事件机制 可以使 代码解耦,更易读.事件机制实现模式是 观察者模式(或发布订阅模式),主要分为三部分:发布者.监听者.事件. Gua ...

  9. 再有人问你Netty是什么,就把这篇文章发给他

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 本文转载于公众号:Hollis 本文基于Netty4.1展开介绍相关理论模型,使用场景,基本组件. ...

最新文章

  1. python sched_python事件调度库sched
  2. C# Socket Server 收不到数据
  3. 文件数据云计算学习笔记---Hadoop HDFS和MapReduce 架构浅析
  4. LeetCode——Find the Difference
  5. 大数据技术 学习之旅_为什么聚焦是您数据科学之旅的关键
  6. 四、比特币的基本原理
  7. LayoutInflater——inflate方法不同参数的区别
  8. 【动态规划】P4170 :涂色(区间dp)
  9. 决策树(一)--ID3
  10. 图标X轴this显示值自定义
  11. [Accessibility] ****************** Loading GAX Client Bundle ****************
  12. 计算机毕业设计ssm基于网络安全维护的机房设备管理19rya系统+程序+源码+lw+远程部署
  13. Apache 支持ipv6 安装及常见问题
  14. c语言有n个人围成一圈用指针,C语言 有n个人围成一圈,按顺序从1到n编号.从第一个人开始报数,报数3的人退出圈子...
  15. 声网发布极速直播、低码高清 首创轻互动直播,节省50%带宽成本
  16. “无论我们多么固执地渴求着对称和永恒,时间总是在不断制造着世间种种的不对称、不可逆以及死亡”。...
  17. linux 定位 踩内存_记录一次用户态踩内存问题
  18. 如何提高团队管理能力6
  19. 持续集成服务 Travis CI 教程
  20. OpenBmc开发1:openbmc简介

热门文章

  1. 画出计算机系统构成的树状图,如何绘制树状层次结构的树状思维导图?
  2. 二叉树,由先序序列和中序序列建树 / 满(真)二叉树由先序序列和后序序列建树
  3. 电容的种类及特点与性能
  4. GameFrameWork学习笔记(一)
  5. 云服务器被植入挖矿木马,CPU飙升200%处理方案
  6. 秋色园Blog 博客系列索引
  7. 4G EPS 中的 Bearer
  8. 你必须知道的linux开发快捷键,熟知工具快速开发
  9. OData介绍 (SAP)
  10. 3D软件视频制作:unity timeline cinemachine, blender 视频制作编辑器