问题遇到的现象和发生背景
一段多线程的代码,时不时出现报错,非必现,望帮忙解决
问题相关代码,请勿粘贴截图
ListObject>> listenableFutureList = Lists.newArrayList();
for (String dataKey : dataKeySet) {
listenableFutureList.add(asyncQueryManager.submit(() -> tollTimeStatisticsDomainServiceV4.moneyTime(queryParam))) ;
listenableFutureList .add (asyncQueryManager.submit(() -> tollTimeStatisticsDomainServiceV4.chainRatioTollTime(queryParam))) ;
listenableFutureList .add (asyncQueryManager.submit(() -> tollTimeStatisticsDomainServiceV4.chargeFreeStatistics(queryParam))) ;
listenableFutureList .add (asyncQueryManager.submit(() -> tollTimeStatisticsDomainServiceV4.moneyRecoverTime(queryParam))) ;
listenableFutureList .add (asyncQueryManager.submit(() -> tollTimeStatisticsDomainServiceV4.chainFromPreiod(queryParam))) ;
listenableFutureList .add (asyncQueryManager.submit(() -> tollTimeStatisticsDomainServiceV4.feeGrowthTrend(queryParam))) ;
listenableFutureList .add (asyncQueryManager.submit(() -> tollTimeStatisticsDomainServiceV4.annualFeeTarget(queryParam))) ;
}
List resultList = asyncQueryManager .getTaskListResult (10 L, listenableFutureList) ;
Map <String , Object > result = Maps .newHashMap () ;
if (CollectionUtils.isNotEmpty(resultList)) {
resultList .stream () .forEach (a -> result.putAll((Map <String , Object >) a)) ;
}
public List getTaskListResult(Long waitSeconds ,Collection> listenableFutures ) {
ListenableFuture[] array = new ListenableFuture[listenableFutures .size ()] ;
return getTaskResult(waitSeconds ,listenableFutures .toArray (array ) );
}
// 获取异步线程结果等待时间,单位:秒
public List getTaskResult(Long waitSeconds ,ListenableFuture ... listenableFutures ){
waitSeconds = getWaitSeconds(waitSeconds ) ;
try {
if (ObjectUtils . isEmpty(listenableFutures ) ){
return null;
}else {
return Futures . allAsList(listenableFutures ) .get(waitSeconds, TimeUnit.SECONDS);
}
} catch (InterruptedException e) {
log.error("等待处理结果时被打断" ,e);
// Thread.currentThread().interrupt();
} catch (ExecutionException e) {
e.printStackTrace() ;
log.error("ExecutionException" ,e);
} catch (TimeoutException e) {
e.printStackTrace() ;
log.error("等待处理结果超时" ,e);
}
return null;
}
运行结果及报错内容
java.util .concurrent .ExecutionException : java.lang .NullPointerException
at com.google .common .util .concurrent .AbstractFuture .getDoneValue (AbstractFuture.java :564 )
at com.google .common .util .concurrent .AbstractFuture .get (AbstractFuture.java :443 )
at com.google .common .util .concurrent .AbstractFuture$TrustedFuture .get (AbstractFuture.java :109 )
at com.hiscene .hds .opendata .server .common .AsyncQueryManager .getTaskResult (AsyncQueryManager.java :87 )
at com.hiscene .hds .opendata .server .common .AsyncQueryManager .getTaskListResult (AsyncQueryManager.java :72 )
at com.hiscene .hds .opendata .server .submodule .toll .service .app .TollStatisticsServiceV4 .getTollStatisticsData (TollStatisticsServiceV4.java :71 )
at com.hiscene .hds .opendata .server .submodule .toll .controller .TollStatisticsControllerV4 .getTollStatisticsData$original $Dyd6AcbV (TollStatisticsControllerV4.java :47 )
at com.hiscene .hds .opendata .server .submodule .toll .controller .TollStatisticsControllerV4 .getTollStatisticsData$original $Dyd6AcbV $accessor $BTxWJmE3 (TollStatisticsControllerV4.java)
at com.hiscene .hds .opendata .server .submodule .toll .controller .TollStatisticsControllerV4$auxiliary $AaENxvHt .call (Unknown Source)
at org.apache .skywalking .apm .agent .core .plugin .interceptor .enhance .InstMethodsInter .intercept (InstMethodsInter.java :86 )
at com.hiscene .hds .opendata .server .submodule .toll .controller .TollStatisticsControllerV4 .getTollStatisticsData (TollStatisticsControllerV4.java)
at com.hiscene .hds .opendata .server .submodule .toll .controller .TollStatisticsControllerV4$$FastClassBySpringCGLIB $$f039dc71 .invoke ()
at org.springframework .cglib .proxy .MethodProxy .invoke (MethodProxy.java :218 )
at org.springframework .aop .framework .CglibAopProxy$CglibMethodInvocation .invokeJoinpoint (CglibAopProxy.java :771 )
at org.springframework .aop .framework .ReflectiveMethodInvocation .proceed (ReflectiveMethodInvocation.java :163 )
at org.springframework .aop .framework .CglibAopProxy$CglibMethodInvocation .proceed (CglibAopProxy.java :749 )
at org.springframework .aop .aspectj .MethodInvocationProceedingJoinPoint .proceed (MethodInvocationProceedingJoinPoint.java :100 )
at com.hiscene .config .RequestAccessLogConfiguration .paramsLogAndTimeAround (RequestAccessLogConfiguration.java :78 )
at sun.reflect .GeneratedMethodAccessor237 .invoke (Unknown Source)
at sun.reflect .DelegatingMethodAccessorImpl .invoke (DelegatingMethodAccessorImpl.java :43 )
at java.lang .reflect .Method .invoke (Method.java :498 )
at org.springframework .aop .aspectj .AbstractAspectJAdvice .invokeAdviceMethodWithGivenArgs (AbstractAspectJAdvice.java :644 )
at org.springframework .aop .aspectj .AbstractAspectJAdvice .invokeAdviceMethod (AbstractAspectJAdvice.java :633 )
at org.springframework .aop .aspectj .AspectJAroundAdvice .invoke (AspectJAroundAdvice.java :70 )
at org.springframework .aop .framework .ReflectiveMethodInvocation .proceed (ReflectiveMethodInvocation.java :175 )
at org.springframework .aop .framework .CglibAopProxy$CglibMethodInvocation .proceed (CglibAopProxy.java :749 )
at org.springframework .aop .interceptor .ExposeInvocationInterceptor .invoke (ExposeInvocationInterceptor.java :95 )
at org.springframework .aop .framework .ReflectiveMethodInvocation .proceed (ReflectiveMethodInvocation.java :186 )
at org.springframework .aop .framework .CglibAopProxy$CglibMethodInvocation .proceed (CglibAopProxy.java :749 )
at org.springframework .aop .framework .CglibAopProxy$DynamicAdvisedInterceptor .intercept (CglibAopProxy.java :691 )
at com.hiscene .hds .opendata .server .submodule .toll .controller .TollStatisticsControllerV4$$EnhancerBySpringCGLIB $$e0cb6de7 .getTollStatisticsData ()
at sun.reflect .GeneratedMethodAccessor363 .invoke (Unknown Source)
at sun.reflect .DelegatingMethodAccessorImpl .invoke (DelegatingMethodAccessorImpl.java :43 )
at java.lang .reflect .Method .invoke (Method.java :498 )
at org.springframework .web .method .support .InvocableHandlerMethod .doInvoke (InvocableHandlerMethod.java :190 )
at org.springframework .web .method .support .InvocableHandlerMethod .invokeForRequest (InvocableHandlerMethod.java :138 )
at org.springframework .web .servlet .mvc .method .annotation .ServletInvocableHandlerMethod .invokeAndHandle (ServletInvocableHandlerMethod.java :105 )
at org.springframework .web .servlet .mvc .method .annotation .RequestMappingHandlerAdapter .invokeHandlerMethod (RequestMappingHandlerAdapter.java :878 )
at org.springframework .web .servlet .mvc .method .annotation .RequestMappingHandlerAdapter .handleInternal (RequestMappingHandlerAdapter.java :792 )
at org.springframework .web .servlet .mvc .method .AbstractHandlerMethodAdapter .handle (AbstractHandlerMethodAdapter.java :87 )
at org.springframework .web .servlet .DispatcherServlet .doDispatch (DispatcherServlet.java :1040 )
at org.springframework .web .servlet .DispatcherServlet .doService (DispatcherServlet.java :943 )
at org.springframework .web .servlet .FrameworkServlet .processRequest (FrameworkServlet.java :1006 )
at org.springframework .web .servlet .FrameworkServlet .doPost (FrameworkServlet.java :909 )
at javax.servlet .http .HttpServlet .service (HttpServlet.java :665 )
at org.springframework .web .servlet .FrameworkServlet .service (FrameworkServlet.java :883 )
at javax.servlet .http .HttpServlet .service (HttpServlet.java :750 )
at org.apache .catalina .core .ApplicationFilterChain .internalDoFilter (ApplicationFilterChain.java :231 )
at org.apache .catalina .core .ApplicationFilterChain .doFilter (ApplicationFilterChain.java :166 )
at org.apache .tomcat .websocket .server .WsFilter .doFilter (WsFilter.java :53 )
at org.apache .catalina .core .ApplicationFilterChain .internalDoFilter (ApplicationFilterChain.java :193 )
at org.apache .catalina .core .ApplicationFilterChain .doFilter (ApplicationFilterChain.java :166 )
at brave.servlet .TracingFilter .doFilter (TracingFilter.java :68 )
at org.apache .catalina .core .ApplicationFilterChain .internalDoFilter (ApplicationFilterChain.java :193 )
at org.apache .catalina .core .ApplicationFilterChain .doFilter (ApplicationFilterChain.java :166 )
at org.springframework .web .filter .RequestContextFilter .doFilterInternal (RequestContextFilter.java :100 )
at org.springframework .web .filter .OncePerRequestFilter .doFilter (OncePerRequestFilter.java :119 )
at org.apache .catalina .core .ApplicationFilterChain .internalDoFilter (ApplicationFilterChain.java :193 )
at org.apache .catalina .core .ApplicationFilterChain .doFilter (ApplicationFilterChain.java :166 )
at org.springframework .web .filter .FormContentFilter .doFilterInternal (FormContentFilter.java :93 )
at org.springframework .web .filter .OncePerRequestFilter .doFilter (OncePerRequestFilter.java :119 )
at org.apache .catalina .core .ApplicationFilterChain .internalDoFilter (ApplicationFilterChain.java :193 )
at org.apache .catalina .core .ApplicationFilterChain .doFilter (ApplicationFilterChain.java :166 )
at brave.servlet .TracingFilter .doFilter (TracingFilter.java :87 )
at org.springframework .cloud .sleuth .instrument .web .LazyTracingFilter .doFilter (TraceWebServletAutoConfiguration.java :139 )
at org.apache .catalina .core .ApplicationFilterChain .internalDoFilter (ApplicationFilterChain.java :193 )
at org.apache .catalina .core .ApplicationFilterChain .doFilter (ApplicationFilterChain.java :166 )
at org.springframework .boot .actuate .metrics .web .servlet .WebMvcMetricsFilter .doFilterInternal (WebMvcMetricsFilter.java :93 )
at org.springframework .web .filter .OncePerRequestFilter .doFilter (OncePerRequestFilter.java :119 )
at org.apache .catalina .core .ApplicationFilterChain .internalDoFilter (ApplicationFilterChain.java :193 )
at org.apache .catalina .core .ApplicationFilterChain .doFilter (ApplicationFilterChain.java :166 )
at org.springframework .web .filter .CharacterEncodingFilter .doFilterInternal (CharacterEncodingFilter.java :201 )
at org.springframework .web .filter .OncePerRequestFilter .doFilter (OncePerRequestFilter.java :119 )
at org.apache .catalina .core .ApplicationFilterChain .internalDoFilter (ApplicationFilterChain.java :193 )
at org.apache .catalina .core .ApplicationFilterChain .doFilter (ApplicationFilterChain.java :166 )
at org.apache .catalina .core .StandardWrapperValve .invoke (StandardWrapperValve.java :202 )
at org.apache .catalina .core .StandardContextValve .invoke (StandardContextValve.java :96 )
at org.apache .catalina .authenticator .AuthenticatorBase .invoke (AuthenticatorBase.java :541 )
at org.apache .catalina .core .StandardHostValve .invoke$original $fB9z2Ve3 (StandardHostValve.java :139 )
at org.apache .catalina .core .StandardHostValve .invoke$original $fB9z2Ve3 $accessor $HYrkMTVo (StandardHostValve.java)
at org.apache .catalina .core .StandardHostValve$auxiliary $3 ZOx8fIV.call (Unknown Source)
at org.apache .skywalking .apm .agent .core .plugin .interceptor .enhance .InstMethodsInter .intercept (InstMethodsInter.java :86 )
at org.apache .catalina .core .StandardHostValve .invoke (StandardHostValve.java)
at org.apache .catalina .valves .ErrorReportValve .invoke (ErrorReportValve.java :92 )
at org.apache .catalina .core .StandardEngineValve .invoke (StandardEngineValve.java :74 )
at org.apache .catalina .connector .CoyoteAdapter .service (CoyoteAdapter.java :343 )
at org.apache .coyote .http11 .Http11Processor .service (Http11Processor.java :373 )
at org.apache .coyote .AbstractProcessorLight .process (AbstractProcessorLight.java :65 )
at org.apache .coyote .AbstractProtocol$ConnectionHandler .process (AbstractProtocol.java :868 )
at org.apache .tomcat .util .net .NioEndpoint$SocketProcessor .doRun (NioEndpoint.java :1589 )
at org.apache .tomcat .util .net .SocketProcessorBase .run (SocketProcessorBase.java :49 )
at java.util .concurrent .ThreadPoolExecutor .runWorker (ThreadPoolExecutor.java :1149 )
at java.util .concurrent .ThreadPoolExecutor$Worker .run (ThreadPoolExecutor.java :624 )
at org.apache .tomcat .util .threads .TaskThread$WrappingRunnable .run (TaskThread.java :61 )
at java.lang .Thread .run (Thread.java :748 )
Caused by: java.lang .NullPointerException : null
我的解答思路和尝试过的方法
1、加入为空判断
if (ObjectUtils.isEmpty(listenableFutures)){
return null ;
}else {
return Futures.allAsList(listenableFutures).get (waitSeconds, TimeUnit.SECONDS);
}
2、估计是线程中的自己实现的方法有问题,但如果是线程中的自己实现的方法报错,抛出的异常会显示出来,现在是无显示