@EnableConfigurationProperties(XXXXElasticSearchProperties.class)
@ConditionalOnProperty(value = "xxxxx.es.enabled", havingValue = "true")
@ConditionalOnClass(RestHighLevelClient.class)
@ConditionalOnBean(RestHighLevelClient.class)
public class LogAutoConfig {
@Bean(name = "restHighLevelClient")
public RestHighLevelClient restHighLevelClient() {
// 拆分地址
YidianElasticSearchProperties.Rest rest = yidianElasticSearchProperties.getRest();
final boolean credentials =
rest == null || StringUtils.isEmpty(rest.getPassword()) || StringUtils.isEmpty(rest.getUsername());
// 权限验证
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
if (!credentials) {
// 配置权限验证
credentialsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials(rest.getUsername(), rest.getPassword()));
}
// 转换成 HttpHost 数组
HttpHost[] httpHost =
yidianElasticSearchProperties.getUris().stream().map(HttpHost::create).toArray(HttpHost[]::new);
// 构建连接对象
RestClientBuilder builder = RestClient.builder( httpHost);
// 异步连接延时配置
builder.setRequestConfigCallback(requestConfigBuilder -> {
requestConfigBuilder.setConnectTimeout(yidianElasticSearchProperties.getConnectTimeout());
requestConfigBuilder.setSocketTimeout(yidianElasticSearchProperties.getSocketTimeout());
requestConfigBuilder
.setConnectionRequestTimeout(yidianElasticSearchProperties.getConnectionRequestTimeout());
return requestConfigBuilder;
});
// 异步连接数配置
builder.setHttpClientConfigCallback( httpClientBuilder -> {
httpClientBuilder.setMaxConnTotal(yidianElasticSearchProperties.getMaxConnectNum());
httpClientBuilder.setMaxConnPerRoute(yidianElasticSearchProperties.getMaxConnectPerRoute());
if (credentials) {
httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
return httpClientBuilder;
});
return new RestHighLevelClient(builder);
}
}
这个配置在自定义的 starer
里面,启动时这个类有被扫描到但是不符合 math
所以没有被装配。
然后我手动复制一份这个类命名为 LogAutoConfig1
,并删除了 @ConditionalOnClass
@ConditionalOnBean
等一系列条件装配注解,神奇的是这个它居然报错 restHighLevelClient define in starter xxx path
说是在 starter 中 define 了,这就很奇怪了之前不是都没有装配,这下为什么会提示 define
了,于是我删除了 LogAutoConfig1
中的 restHighLevelClient
这部分代码,至此代码成功注册到 spring
。
这是为什么?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.