当前位置: 首页 > news >正文

是否有可能一个人完成网站开发培训心得模板

是否有可能一个人完成网站开发,培训心得模板,北京工地网站建设,深圳制作网站软件问题描述 springboot项目中,需要使用到异步调用某个方法,此时 第一个想到的就是 Async 注解,但是 发现 方法执行报错了,具体报错如下: java.lang.NullPointerExceptionat com.ruoyi.common.utils.ServletUtils.getRe…

问题描述

springboot项目中,需要使用到异步调用某个方法,此时 第一个想到的就是 @Async 注解,但是 发现 方法执行报错了,具体报错如下:

java.lang.NullPointerExceptionat com.ruoyi.common.utils.ServletUtils.getRequest(ServletUtils.java:56)at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:782)at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:717)at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:443)at com.ruoyi.web.ecs.service.impl.EcsCollectOperateServiceImpl.collect(EcsCollectOperateServiceImpl.java:42)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:90)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)at java.lang.reflect.Method.invoke(Method.java:508)at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115)at java.util.concurrent.FutureTask.run(FutureTask.java:277)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1160)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)at java.lang.Thread.run(Thread.java:825)

上面日志有点多,其实核心就是这一部分日志:

java.lang.NullPointerExceptionat com.ruoyi.common.utils.ServletUtils.getRequest(ServletUtils.java:56)

这块逻辑就是,使用spring底层提供的获取上下文信息的方法。
所以说明 获取不到上下文信息,结果导致报错

解决办法

  • 对自定义的配置类 进行改造,原来的配置类是这样的:

import java.lang.reflect.Method;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;@Configuration
@EnableAsync
public class AsyncConfiguration {private static final Logger logger = LoggerFactory.getLogger(AsyncConfiguration.class);@Bean(name = "taskExecutor")public Executor getAsyncExecutor() {ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();// 核心线程数:线程池创建时候初始化的线程数taskExecutor.setCorePoolSize(10);// 最大线程数:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程taskExecutor.setMaxPoolSize(20);// 缓冲队列:用来缓冲执行任务的队列taskExecutor.setQueueCapacity(50);// 允许线程的空闲时间60秒:当超过了核心线程之外的线程在空闲时间到达之后会被销毁taskExecutor.setKeepAliveSeconds(60);// 线程池名的前缀:设置好了之后可以方便我们定位处理任务所在的线程池taskExecutor.setThreadNamePrefix("HiTask-");// 缓冲队列满了之后的拒绝策略:由调用线程处理(一般是主线程)//taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());taskExecutor.initialize();return taskExecutor;}class MyAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {@Overridepublic void handleUncaughtException(Throwable throwable, Method method, Object... objects) {logger.error("MethodName={},Throwable={}",method.getName(),throwable.toString());}}
}
  • 改造之后:

import java.lang.reflect.Method;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;@Configuration
@EnableAsync
public class AsyncConfiguration {private static final Logger logger = LoggerFactory.getLogger(AsyncConfiguration.class);@Bean(name = "taskExecutor")public Executor getAsyncExecutor() {ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();// 核心线程数:线程池创建时候初始化的线程数taskExecutor.setCorePoolSize(10);// 最大线程数:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程taskExecutor.setMaxPoolSize(20);// 缓冲队列:用来缓冲执行任务的队列taskExecutor.setQueueCapacity(50);// 允许线程的空闲时间60秒:当超过了核心线程之外的线程在空闲时间到达之后会被销毁taskExecutor.setKeepAliveSeconds(60);// 线程池名的前缀:设置好了之后可以方便我们定位处理任务所在的线程池taskExecutor.setThreadNamePrefix("HiTask-");// 缓冲队列满了之后的拒绝策略:由调用线程处理(一般是主线程)//taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());taskExecutor.initialize();//解决使用@Async注解,获取不到上下文信息的问题taskExecutor.setTaskDecorator(runnable -> {RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();return ()->{try {// 我们set 进去 ,其实是一个ThreadLocal维护的.RequestContextHolder.setRequestAttributes(requestAttributes);runnable.run();} finally {// 最后记得释放内存RequestContextHolder.resetRequestAttributes();}};});return taskExecutor;}class MyAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {@Overridepublic void handleUncaughtException(Throwable throwable, Method method, Object... objects) {logger.error("MethodName={},Throwable={}",method.getName(),throwable.toString());}}
}

总结

解决使用@Async注解,获取不到上下文信息的问题,只需要增加这一段代码即可

 taskExecutor.setTaskDecorator(runnable -> {RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();return ()->{try {// 我们set 进去 ,其实是一个ThreadLocal维护的.RequestContextHolder.setRequestAttributes(requestAttributes);runnable.run();} finally {// 最后记得释放内存RequestContextHolder.resetRequestAttributes();}};});

额外补充一点

如果使用 @Async注解,发现没有生效,那有可能 你没有加 @EnableAsync 注解。
@EnableAsync注解表示 开启异步任务,可以写在springboot的启动类上,也可以写在 配置类上

http://www.dinnco.com/news/15844.html

相关文章:

  • wordpress网站被拒登个人引流推广怎么做
  • 免费网站源码html分类达人介绍
  • 深圳家装网站建设多少钱百度推广找谁
  • flash可以做网站吗实时疫情最新消息数据
  • 想注册一个做网站的公司好长沙谷歌优化
  • 如何建造网站专业竞价托管哪家好
  • 安装师傅最好的接单平台上海网络seo公司
  • 哈尔滨网站制作哪家好薇关注公众号推广2元一个
  • 移动网站建设的前景上海网上推广
  • 视频 主题 wordpress太原seo全网营销
  • 用模板建商场购物网站抖音视频排名优化
  • 网站的互动功能百度网站网址是多少
  • 建设银行app下载常用的seo工具的是有哪些
  • 网站的风格设计有哪些百度的官方网站
  • 国内做的比较好的跨境电商网站seo营销推广服务公司
  • 茶网站开发的意义目的长沙靠谱seo优化费用
  • 视频拍摄appseo策略什么意思
  • 免费建设网站设计页面百度推广登录首页
  • 亚洲精华国产精华液的护肤功效重庆网站seo好不好
  • 做任务免费得晋江币网站怎样才能在百度上发布信息
  • 武汉网站建设电话网络代理app
  • 网站管理员怎样管理员权限设置专业推广公司
  • 网站开发专业社会实践调研报告网络营销平台有哪些?
  • Python电影网站开发百度云官方网站
  • wordpress安装没有选择语言seo运营招聘
  • 织梦做的网站怎么上传视频教程中国今天刚刚发生的新闻
  • 用织梦做视频网站体验式营销经典案例
  • 网站色调陕西网络营销优化公司
  • 对电子政务做技术支持的网站百度认证证书
  • 一同看网页打不开上海搜索引擎优化公司