说明 使用@Async注解创建多线程非常的方便,还可以通过配置,实现线程池.比直接使用线程池简单太多.而且在使用上跟普通方法没什么区别,加上个@Async注解即可实现异步调用. 用法 AsyncTask.java @Component public class AsyncTask { private static final Logger LOG = LoggerFactory.getLogger(AsyncTask.class); @Async public void register(){…
说明 使用@Async注解创建多线程非常的方便,还可以通过配置,实现线程池.比直接使用线程池简单太多.而且在使用上跟普通方法没什么区别,加上个@Async注解即可实现异步调用. 用法 AsyncTask.java @Component public class AsyncTask { private static final Logger LOG = LoggerFactory.getLogger(AsyncTask.class); @Async public void register(){…
转载自博客https://www.jianshu.com/p/7ac04a501eba…
介绍 当涉及到企业应用程序时,正确地管理对数据库的并发访问是至关重要的.为此,我们可以使用Java Persistence API提供的乐观锁定机制.它导致在同一时间对同一数据进行多次更新不会相互干扰.为了使用OptimisticLocking,我们需要一个实体(Entity),其中包含一个带有@Version注释的属性.在使用它时,每个读取数据的事务都持有version属性的值.在事务想要进行更新之前,它将再次检查version属性.如果值在此期间发生了更改,则抛出ObjectOptimist…
前言 在之前的文章中,讲解了使用redis解决集群环境session共享的问题[快学springboot]11.整合redis实现session共享,这里已经引入了redis相关的依赖,并且通过springboot的配置,实现了session共享.下面,我们就通过springboot提供的RedisTemplate来操作redis. 注入RedisTemplate @Autowired private StringRedisTemplate redisTemplate; 这里我注入了一个Stri…
前言 之前在[快学springboot]6.WebMvcConfigurer配置静态资源和解决跨域里有用到WebMvcConfigurer接口来实现静态资源的映射和解决跨域请求,并且在文末还说了WebMvcConfigurer(springboot2.x之后使用该接口,springboot1.x使用WebMvcConfigurerAdapter类,不过该类已经被标识过期了)可以配置很多东西,如下: 下面,我们就通过代码,使用WebMvcConfigurer接口来实现一个springboot的拦截…
前言 在开发接口的时候,参数校验是必不可少的.参数的类型,长度等规则,在开发初期都应该由产品经理或者技术负责人等来约定.如果不对入参做校验,很有可能会因为一些不合法的参数而导致系统出现异常. 上一篇文章讲了多种接受参数的方法[快学springboot]3.多种接受参数的方式.因为目前json类型的参数是最常用的,所以这里只讲解json类型的参数校验.其他类型的大同小异. 新建一个Param.java public class Param { private String username; pu…
前言 之前已经写过一篇文章介绍SpringBoot整合Spring Cache,SpringBoot默认使用的是ConcurrentMapCacheManager,在实际项目中,我们需要一个高可用的.分布式的缓存解决方案,使用默认的这种缓存方式,只是在当前进程里缓存了而已.Spring Cache整合Redis来实现缓存,其实也不是一件复杂的事情,下面就开始吧. 关于Spring Cache的运用,请参考[快学SpringBoot]快速上手好用方便的Spring Cache缓存框架 新建一个Sp…
背景 在 使用springCloud 的@Async注解来做异步操作时,想自定义其线程池. 引发问题 自定义完线程池后,发现代码里并没有使用自定义线程池里的线程,于是新建一个demo工程,一样的配置代码,又测试了一下,发现自定义线程池竟然起作用了,...经过排查,发现项目里对加@Async注解的方法调用是在同一个类里被调用的,即异步方法是被同一个类中的另一个方法调用的,由此想起以前在使用Cacheale因为同类调用导致缓存不起作用. 原因 spring 的这些注解是使用spring aop来动态…
前面的章节中,我们介绍了使用@Async注解来实现异步调用,但是,对于这些异步执行的控制是我们保障自身应用健康的基本技能.本文我们就来学习一下,如果通过自定义线程池的方式来控制异步调用的并发. 定义线程池 在springboot主类中定义一个线程池 @EnableAsync @Configuration class TaskPoolConfig{ @Bean("taskExecutor") public Executor taskExecutor(){ ThreadPoolTaskEx…