添加guava框架,实现异步处理。

一、添加依赖

<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>18.0</version>
</dependency>

二、注册为组件Bean

import com.google.common.eventbus.AsyncEventBus;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;/*** web 配置类** @author Creator*/
@Configuration
public class WebConfig implements WebMvcConfigurer {/*** AsyncEventBus注册*/@Beanpublic AsyncEventBus asyncEventBus() {// 创建一个核心3线程,最大10线程的线程池,配置DiscardPolicy策略,抛弃当前任务ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3,10,60, TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(10),new ThreadPoolExecutor.DiscardPolicy());return new AsyncEventBus(threadPoolExecutor);}}

三、添加事件处理监听器

import com.google.common.eventbus.AsyncEventBus;
import com.google.common.eventbus.Subscribe;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;/*** 异步监听处理器*/
@Component
public class AsyncEventListener {/*** 日志*/private final static Logger logger = LoggerFactory.getLogger(AsyncEventListener.class);@Autowiredprivate AsyncEventBus asyncEventBus;@Autowiredprivate ILoginLogService loginLogService;/*** 注册这个监听器*/@PostConstructpublic void register(){asyncEventBus.register(this);}/*** 具体业务处理(此处比如向库中添加登录日志)* sysLoginLogPO: 登录日志表对应实体(替换成自己的传参实体即可)*/@Subscribepublic void addLoginLog(SysLoginLogPO sysLoginLogPO) {logger.info("添加登录日志:sysLoginLogPO=" + sysLoginLogPO);// 执行具体添加日志操作loginLogService.insert(sysLoginLogPO);}/*** 其他需要异步的业务方法*/@Subscribepublic void XXX(XXXXPO xxxxpoPO) {logger.info("日志:xxxxpoPO=" + xxxxpoPO);// 执行具体添加日志操作 TODO}
}

四、业务层调用

    @Autowiredprivate AsyncEventBus asyncEventBus;/*** 业务处理方法(业务封装)*/public void doAddLoginLog(){SysLoginLogPO sysLoginLogPO = new SysLoginLogPO();// 提交异步处理, 会执行AsyncEventListener中的 addLoginLog 方法,根据参数类型匹配asyncEventBus.post(sysLoginLogPO);}

五、guava同spring集成

可以参考 https://blog.csdn.net/yxp20092010/article/details/46537333

注意:上面链接的这个文章实现出来的是默认的同步,如果需求要使用异步,那么参考如下修改:

EventBusAdapter extends EventBus   一定要改为继承 AsyncEventBus 类,

然后添加一个构造方法,如下:

public class EventBusAdapter extends AsyncEventBus implements InitializingBean {private List<EventAbstract> eventBusListener;// 默认构造方法public EventBusAdapter (Executor executor, List<EventAbstract> eventBusListener) {super(executor);this.eventBusListener = eventBusListener;}@Overridepublic void afterPropertiesSet() throws Exception {for(EventAbstract eventAbstract : eventBusListener){this.register(eventAbstract);}}}

spring配置修改:

<!-- spring thread pool executor -->
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"><!-- 线程池维护线程的最少数量 --><property name="corePoolSize" value="5" /><!-- 允许的空闲时间 --><property name="keepAliveSeconds" value="200" /><!-- 线程池维护线程的最大数量 --><property name="maxPoolSize" value="10" /><!-- 缓存队列 --><property name="queueCapacity" value="20" /><!-- 对拒绝task的处理策略 --><property name="rejectedExecutionHandler"><bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" /></property>
</bean><!-- EventBusListener 定义 -->
<util:list id="eventBusListener" value-type="com.qyou.EventAbstract"><bean class="com.qyou.SendFailMailHandler "/><bean class="com.qyou.SendSuccessSMSHandler "/>
</util:list><!-- EventBusAdapter适配器 -->
<bean id="eventBusAdapter" class="com.qyou..EventBusAdapter"><constructor-arg name="eventBusListener" ref="eventBusListener"/><constructor-arg name="executor" ref="taskExecutor"/>
</bean>

SpringBoot + Springmvc集成guava相关推荐

  1. SpringBoot 快速集成 JWT 实现用户登录认证

    前言:当今前后端分离时代,基于Token的会话保持机制比传统的Session/Cookie机制更加方便,下面我会介绍SpringBoot快速集成JWT库java-jwt以完成用户登录认证. 一.JWT ...

  2. Java项目:嘟嘟图片展览馆管理系统(java+Springboot+SpringMVC+JPA+Jsp+maven+mysql)

    源码获取:博客首页 "资源" 里下载! 一.项目运行 环境配置: Jdk1.8 + Tomcat8.5 + mysql + Eclispe(IntelliJ IDEA,Eclisp ...

  3. springboot springmvc 抛出全局异常解决方法

    springboot springmvc 抛出全局异常解决方法 参考文章: (1)springboot springmvc 抛出全局异常解决方法 (2)https://www.cnblogs.com/ ...

  4. springboot项目集成docker

    文章目录 一.docker常用命令 0.拉取镜像到本地仓库 1.查看所有镜像 2.创建一个新的容器并运行,返回的是容器的ID -- CONTAINER ID: 3.查看运行中的docker实例 4.查 ...

  5. SpringMvc 集成 shiro 实现权限角色管理-maven

    2019独角兽企业重金招聘Python工程师标准>>> SpringMvc 集成 shiro 实现权限角色管理 1.项目清单展示 2.项目源码解析  1)spring-context ...

  6. springboot的jsp应该放在哪_在springboot中集成jsp开发

    springboot就是一个升级版的spring.它可以极大的简化xml配置文件,可以采用全注解形式开发,一个字就是很牛. 在springboot想要使用jsp开发,需要集成jsp,在springbo ...

  7. springboot+mybatis集成自定义缓存ehcache用法笔记

    今天小编给大家整理了springboot+mybatis集成自定义缓存ehcache用法笔记,希望对大家能有所办帮助! 一.ehcache介绍 EhCache 是一个纯Java的进程内缓存管理框架,属 ...

  8. Springboot/Cloud集成Sentinel 和 入门实战

    文章目录 一.Springboot/Cloud集成Sentinel 1. spring-cloud-alibaba依赖 2. 引入 Sentinel starter 3. 配置application. ...

  9. springMVC集成缓存框架Ehcache

    概述 Ehcache算是当前比较流行的缓存框架,使用缓存可以极大的缓解服务器和数据库的压力,提高访问效率,提高服务器的并发能力.接下来我们看怎么把缓存在spring mvc种使用起来. 详细 代码下载 ...

最新文章

  1. Headfirst JSP 01 (概述)
  2. Android中的日期控件DatePicker和DatePickerDialog
  3. UVA Mapping the Swaps
  4. java oca_OCA的Java拼图游戏第3部分
  5. C++11标准库 - array 1
  6. 微信公众号开发 包括服务器配置、java web项目搭建、tomcat手动发布web项目、微信开发所需的url和token验证 2017.12.2...
  7. Linux如何查看信号宏定义,转  LINUX 调试宏定义
  8. windows找不到文件gpedit.msc_u盘插入电脑在windows却找不到u盘的解决办法【详解】...
  9. VC6.0编译错误解决方法集锦
  10. SQL的bit列名转换成access是/否数据类型,True无效的问题
  11. 状态机finite-state machine学习笔记2——按键消抖初步(1)
  12. C语言种根号怎么表示 比如(1-x)的二分之一次方
  13. 计算机中模拟和数字信号,模拟信号和数字信号的区别是什么
  14. Android DRM
  15. 我的挣扎 与 TBtools 的开发
  16. 百度网盘和百度云有什么区别
  17. 记录从指尖悄悄流逝的时间
  18. Spark:reduceByKey与groupByKey进行对比
  19. 从零开始手写VIO第三章作业(含关键点细节及思维过程)
  20. Python自动化办公——生成Excel入库统计表

热门文章

  1. 0111总结-函数与极限-高等数学
  2. HTML5 APP开发环境的框架搭建
  3. 计算机网络wifi是什么意思,Mifi是什么,和wifi有什么区别?
  4. JS中生成与解析JSON
  5. 玩转Qml(18)-用户向导
  6. 标准代码及数据字典的实现
  7. SystemUI(一)基于Android9.0SystemUI的启动与定制化
  8. 应广单片机003烧录器万能烧录方法
  9. 一文搞懂PMP挣值管理那些让你头疼的公式
  10. 研华PCI1716L的C#编程