布景
记载一个最近半年犯了两次的低级编码过错,校验某个字符串信息为枚举类的某实例时,写成了:枚举类的实例.equals(字符串)
,成果总是 false
,打印信息貌似正确,实践履行成果总是不达预期,仔细看看代码才发现问题。本文记载本周开发工作中遇到的几个小问题,Bug 是无法彻底消除的,只能尽量减少。
ES 衔接及时封闭
检查某进程的端口占用时,看到好多正衔接着的 ES 衔接目标,普通的 Java Web 运用,没有后台任务,怎么会保持这么多衔接呢?
问题剖析:代码有缺点,有些恳求运用 ES 进行数据查询完结后,没有封闭 ES 衔接目标。ES 衔接不封闭,有什么问题呢?
Linux 的每个衔接都会创建一个文件句柄,毫无疑问,Socket 衔接用完后不封闭,会导致端口资源泄漏。
jackson 序列化反常
在将 ElasticSearch 的 Response
目标序列化时碰到一个反常信息:
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.elasticsearch.common.text.Text and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: org.elasticsearch.action.search.SearchResponse["hits"]->org.elasticsearch.search.SearchHits["hits"]->org.elasticsearch.search.SearchHit[0]->org.elasticsearch.search.SearchHit["shard"]->org.elasticsearch.search.SearchShardTarget["nodeIdText"])
有两种解决办法:
- 定义一个装备类,设置 jackson 的序列化装备特点。
- 经过 SpringBoot 的全局装备
spring.jackson.serialization.FAIL_ON_EMPTY_BEANS
设置为 false ,该装备默认为 true ,这个方式更方便。
ElasticSearch 履行 SQL 的 Java 完结
回到文章标题说的问题,ElasticSearch 6 今后的版本支撑 SQL 句子检索了,如何用 Java 代码完结 ES SQL 检索呢?
榜首 Part,基础知识。 先搞明白需求及相关的技术支撑,主要如下:
- ElasticSearch-SQL 功能,区别 GitHub 上的一个插件和 ElasticSearch 本身的支撑能力。ES 6 今后内置了X-Pack 组件,供给了 Elasticsearch SQL 能力,就是说不用装置插件就能够运用 ES SQL 能力了。而网上很多都是介绍 ElasticSearch SQL 插件装置的,却不曾想 ES 已经内置了。
- ES 6 与 ES 8 的 Rest API 的语法不一样,8 以上的版本句子是
/_xpack/_sql?format=
,可是旧版本是/_xpack/sql?format=
,版本依赖问题有时分挺坑的。网上很多的材料,估计都是来自官网,全都是/_xpack/_sql?format=
,成果我测试用的环境是 ES6 的,一向报错。
第二 Part, Java 完结 ES-SQL 操作的几种办法:
- Rest API 恳求
/_xpack/sql?format=
。 - JDBC-ES ,这个功能是收费的。
确定计划一。
第三 Part,运用 elasticsearch-rest-high-level-client
包的 RestAPI 客户端工具能够完结 ES-SQL 的操作。基本思路是构建一个 RestClient 目标,恳求途径为 /_xpack/_sql?format=json
这个用 txt 的时分,总是得不到成果,用 json 就没问题。
重要源代码如下:
// ES 衔接信息结构
RestClientBuilder restClientBuilder = null;
if (hasPwd) {
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
/** 设置 ES 认证信息 */
credentialsProvider.setCredentials(AuthScope.ANY,new UsernamePasswordCredentials(userName, password));
restClientBuilder = RestClient.builder(https)
.setHttpClientConfigCallback(httpAsyncClientBuilder -> httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialsProvider));
} else {
restClientBuilder = RestClient.builder(https)
}
// xpack-sql 恳求结构
String searchIndex = "/_xpack/sql?format=json";
Request request = new Request("POST", searchIndex);
request.setJsonEntity(queryJsonString);
RestClient restClient = restClientBuilder.build();
try {
Response response = restClient.performRequest(request);
String body = EntityUtils.toString(response.getEntity());
// TODO 处理 ES 响应成果
} catch (IOException e) {
}
ToDesk 服务占据高 CPU
电脑一向占据很多的 CPU,top 看是 ToDesk 进程,履行下面的操作好了:
sudo launchctl unload /Library/LaunchDaemons/com.youqu.todesk.service.plist
我碰到的问题,肯定不是个例,百度是个好东西,面向百度编程也没什么不好啊!
启示录
如何用 Java 完结 ES-SQL 检索流程呢?《ES SQL 检索的 Java 完结流程》,该文给的启示是直接用 Rest API 方式拜访 _xpack/sql
,那就是简单了底层就是 URLConnection
。
而 ES 本身有 RestHighLevelClient 等一些列的 API,怎么用它来完结 _xpack/sql
恳求呢?自己用 RestTemplate 完结却是能够,问题是如果 ES 有认证怎么办呢?
《java 衔接带认证的 elasticsearch》 这篇文章又给了我启示,用 RestClient
衔接 ES 拜访特定的 URL 完结。
参考材料
- 《X-pack-sql VS ElasticSearch-SQL》
- 《java 衔接带认证的 elasticsearch》
- 《ES SQL 检索的 Java 完结流程》