问题:整合es,出现如下异常信息
问题原因:由于es的netty-transport版本冲突导致的,Elasticsearch 和 Redis 底层都使用到了 Netty , 在项目启动时会冲突。
解决方法:
方法一:在启动类main方法中设置
@SpringBootApplication
public class WebApplication {
public static void main(String[] args) {
// 解决netty-transport版本冲突
System.setProperty("es.set.netty.runtime.available.processors", "false");
SpringApplication.run(WebApplication.class, args);
}
}
方法二:springboot启动后候执行
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import javax.annotation.PostConstruct;
@Order(-1)
@Configuration
public class InitConfig {
@PostConstruct
void init() {
// 解决netty-transport版本冲突
System.setProperty("es.set.netty.runtime.available.processors", "false");
}
}
方法三:springboot启动过程(refresh方法前)执行
首先创建一个class,继承ApplicationContextInitializer
接口,并实现方法initialize
@Order(Ordered.HIGHEST_PRECEDENCE)
public class ApplicationInitConfigRunner implements ApplicationContextInitializer<ConfigurableApplicationContext> {
private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationInitConfigRunner.class);
private static volatile boolean isInit = false;
@Override
public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
if(!isInit) {
isInit = true;
// 解决netty-transport版本冲突
System.setProperty("es.set.netty.runtime.available.processors", "false");
LOGGER.info("**************************es config******************************");
LOGGER.info("es.set.netty.runtime.available.processors:{}", System.getProperty("es.set.netty.runtime.available.processors"));
LOGGER.info("******************************************************************");
}
}
}
1、使用spring.factories方式:
然后在resource下面新建/META-INF/spring.factories文件
org.springframework.context.ApplicationContextInitializer=\com.data.platform.web.config.ApplicationInitConfigRunner
2、application.yml添加配置方式:
对于这种方式是通过DelegatingApplicationContextInitializer这个初始化类中的initialize方法获取到application.properties中context.initializer.classes对应的类并执行对应的initialize方法。只需要将实现了ApplicationContextInitializer的类添加到application.properties即可。我们看看DelegatingApplicationContextInitializer是如何加载的。
因此在application.yml文件中添加如下配置:
context:
initializer:
classes: com.data.platform.web.config.ApplicationInitConfigRunner
3、在启动类main方法直接通过addInitializers方法:
@SpringBootApplication
public class WebApplication {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(WebApplication.class);
springApplication.addInitializers(new ApplicationInitConfigRunner());
springApplication.run(args);
}
}