后台项目基于SpringBoot,集成了ElasticSearch。今天在写单元测试的测试类时,报如下错误。Causedby:org.springframework.beans.factory.BeanCreationException:Errorcreatingbeanwithname'client'definedinclasspathresource[com/lingyejun/project/ds/EsRepositoryConfig.class]:通过工厂方法的Bean实例化失败;嵌套的异常是org.springframework.beans.BeanInstantiationException:Failedtoinstantiate[org.elasticsearch.client.Client]:Factorymethod'client'throwexception;嵌套异常是java.lang.IllegalStateException:availableProcessors已设置为[8],在org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:590)在org.springframework.beans处拒绝[8]。factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1256)在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1105)在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:503)在org.springframework.beans.factory.支持.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317)在org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)在org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315)在org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)在org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:251)在org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138)在org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1065)在org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:818)在org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:724)...94更多Causedby:org.springframework.beans.BeanInstantiationException:Failedtoinstantiate[org.elasticsearch.client.Client]:工厂方法'客户抛出异常;嵌套异常是java.lang.IllegalStateException:availableProcessors已设置为[8],在org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185)在org.springframework.beans处拒绝[8]。factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:582)...107更多Causedby:java.lang.IllegalStateException:availableProcessorsisalreadysetto[8],rejecting[8]检查原始代码设置如下publicstaticvoidmain(String[]args){System.setProperty("es.set.netty.runtime.available.processors","false");SpringApplication.run(TestApplication.class,args);}解决方案查阅资料后发现有两种解决方案setProperty("es.set.netty.runtime.available.processors","false");移动到静态代码块如下:static{System.setProperty("es.set.netty.runtime.available.processors","false");}publicstaticvoidmain(String[]args){SpringApplication.run(TestApplication.class,args);}2.在jvm启动参数中添加-Des.set.netty.runtime.available.processors=false。:IssuewithNettyRuntime$AvailableProcessorsHolder:numberofavailableprocessors·Issue#6956·netty/netty·GitHub原因是程序的其余部分使用Netty,比如大部分项目也会使用Redis。这会影响在实例化传输客户端之前初始化的处理器数量。因为Netty在其他地方使用,初始化已经完成并且Netty对此进行了防范,所以第一次实例化将失败并看到非法状态异常。如果本文对您有帮助,请给“凌夜君”点个赞,谢谢支持。
