Springboot+@Async异步+多线程

博主在写项目是需要添加异步操作来提高效率,在网上有很多关于异步操作的例子 有的是集成消息队列mq(kafka等分布式消息队列 )有的是集成redis的消息队列等操作,关于消息队列的好处可以自行百度一下,在下认为集成消息队列是需要安装对应的程序对于小型项目没有必要,有时项目可能就是需要一个异步方法当然各有各自的好处下面简单说一下:

  缺点:当时用@Async进行异步操作时固然简单但是当整个项目挂掉的时候消息可能不会及时消费

  mq优点:集成消息队列生产者和消费者可能两个单独的应用 当生产者挂掉的时候消费者可以进行正常消费

好了废话不说了,赶紧上代码

1:集成@Async进行一步操作
   在启动类上加上@EnableAsync注解开启异步操作

@SpringBootApplication
@EnableAsync
public class Neo4jV2Application {
public static void main(String[] args) {
    SpringApplication.run(Neo4jV2Application.class, args);
}
}
在方法上使用@Async注解

@Async
public void getWbswryxxMessage(ConsumerRecord record) {

}
好了异步操作完成了是不是很简单,可是可是。。。。。。。。。。。。。。。。。

这里一定要注意千万注意!!!!!!俺就被坑了一次 调用被@Async标记的方法的调用者不能和被调用的方法在同一类中不然不会起作用!!!!!!!

   2:集成多线程操作

   这里使用的是线程池

@Bean(name = "taskExecutorWbswryxx")
public Executor taskExecutorWbswryxx() {
   ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
   executor.setCorePoolSize(10);
   executor.setMaxPoolSize(10);
   executor.setQueueCapacity(200);

   executor.setKeepAliveSeconds(60);
   executor.setThreadNamePrefix("taskExecutorWbswryxx-");
   executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
   executor.setWaitForTasksToCompleteOnShutdown(true);
   executor.setAwaitTerminationSeconds(60);
    return executor;
}
@Bean要起个名字,然后怎么使用呢?很简单只需要在@Async注解添加一个属性

@Async(value = "taskExecutorWbswryxx")
public void getWbswryxxMessage(ConsumerRecord record){
}
这里千万也要注意使用@Async时要求是不能有返回值的不然会报错的 因为异步要求是不关心结果的


原文:https://blog.csdn.net/zhanaolu4821/article/details/80941825 

你可能感兴趣的:(web后台)