java.lang.IllegalStateException: ApplicationEventMulticaster not initialized - call 'refresh' before

前几天发布服务,结果发现了这么一堆堆问题。
 ERROR [localhost-startStop-1] support.DefaultListableBeanFactory.destroyBean:581 - Destroy method on bean with name 'org.springframework.context.annotation.internalScheduledAnnotationProcessor' threw an exception
java.lang.IllegalStateException: ApplicationEventMulticaster not initialized - call 'refresh' before multicasting events via the context: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@65da4a76: startup date [Mon Apr 29 14:55:28 CST 2019]; root of context hierarchy。
-----------------------------------
boot.SpringApplication.reportFailure:771 - Application startup failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.scheduling.annotation.ProxyAsyncConfiguration': Unsatisfied dependency expressed through method 'setConfigurers' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'XXXService': Instantiation of bean failed; nested exception is java.lang.ExceptionInInitializerError
--------------------------------------
Caused by: java.lang.IllegalStateException: fail to create adaptive instance: java.lang.IllegalStateException: Can not create adaptive extension interface 某个包, cause: fail to create adaptive instance: java.lang.NoSuchMethodError: java.util.concurrent.ConcurrentHashMap.keySet()Ljava/util/concurrent/ConcurrentHashMap$KeySetView;

说明:因为很多错误日志信息其实没什么用,就不罗列出来了。

简单说说我的头绪和思路:
其实最开始看到这个问题,大脑一片空白,尤其是看到上面最上面的错误信息是和springboot相关的,怎么可能真的是见鬼了。而且更奇葩的就是我自己本地的代码是可以运行的,发到服务器上之后连tomcat都启动不起来。说真的真的有点不知所措。最开始对自己的代码还不自信,发布到另外一个环境的服务器上面,是可以正常使用的,那么确实不是代码的问题。那么问题来了到底是什么问题。看看上面的东西springboot的东西,在网上谷歌百度了很长时间,都没有一个确切的思路,那么果断放弃上面的,接着往下寻找。看到我项目里面的代码XXXService和jdk的juc包下的ConcurrentHashMap。
看到java.util.concurrent.ConcurrentHashMap.keySet()Ljava/util/concurrent/ConcurrentHashMap$KeySetView;在网上百度了下说是高编译低运行。我去实际看了下jdk7和jdk8的ConcurrentHashMap类,发现KeySetView这个东西确实是jdk8的东西。查看我的服务器的jdk版本确实是1.7的。去找运维的同学查看打包的环境也是1.7的环境。那么确定问题不是出现在我这边的。那么就去找对应XXXService这个服务的提供者,找他们看看他们的这个jar包打的环境是不是1.8的,结果发现他们也都是在1.7环境下打的jar包。之后又往下寻找,找到Can not create adaptive extension interface 某个包, cause: fail to create adaptive instance: java.lang.NoSuchMethodError:java.util.concurrent.ConcurrentHashMap.keySet()Ljava/util/concurrent/ConcurrentHashMap$KeySetView; 这块,去问这块的相应负责人,他们有次是用1.8打包的,但是之后又改成1.7打包了。不过那个负责人告诉我,叫我去找运维的同学,删除打包服务下的关于这个包的缓存,从仓库中重新加载。之后问题就解决了。
------------------------------------------
再说说期间我还做的一些事情:
1.ftp上传自己本地打的jar包。(因为需要维持服务的正常运行,我们上面有业务方使用我们的服务)
那么这就需要对linux命令使用熟练。
2.上传到的war包文件和服务器上打的war包的内容对比。
当然不可能自己去查看内容,对比的是文件的md5值。我本地环境是windows,下载2345好压查看文件的md5值,查看ftp上传到linux服务器上的war文件的md5值(md5sum 文件)发现两个值不一样,百度了下说是ftp上传采用文本模式,会把文件中换行回车替换为换行,所以导致两个操作系统的文件的md5值不一样。ftp需要采用二进制模式上传。
3.关于jar包的SNAPSHOT和RELEASE。通常我们的maven项目中在pom文件中引入文件的版本会是SNAPSHOT或者是RELEASE。一般RELEASE如果有问题,对应jar包的负责方会升级版本,并通知使用方升降依赖版本。而SNAPSHOT比较诡异,不升级版本,可以更新到本地,但是更新的前提不是对比文件的md5值,所以就可能出现问题。当然这次我的问题就是这么来的。

 

我来说说:
我是一个执着的人,出现问题了,我不解决会心里一直惦记着。这就一直牵引这我去解决问题。当然我也喜欢总结问题,并分享给大家。没有解决不掉的问题,就看愿不愿意花费时间去解决。当也得看具体情况,工作事情繁忙的情况下,如果这些问题有补偿措施,可以先采取补偿措施,问题空下来之后解决。没有的话,也需要看问题的重要紧急程度和影响度,合理的安排自己的工作。遇到问题莫慌,沉着下来自己想想,捉到问题的本质,那么就会迎刃而解的,相信自己加油!



  

你可能感兴趣的:(项目问题)