package com.skyable.smartlife.lock.Test;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.reindex.DeleteByQueryRequest;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Map;
/**
* Description:
*
* @author laoyou
* @date: 2023-06-09-11:06
*/
@EnableScheduling
@Component
@Slf4j
public class TimedTask {
@Autowired
private RestHighLevelClient client;
final String INDEX_NAME = "16_speaker_history";
/**
* 删除es日志
* 每月1号凌晨2点执行
*/
//
//@Scheduled(cron = "0 0 2 1 * ?")
@Scheduled(cron = " 0 0/2 * * * ?")
public void deleteLogData() throws Exception {
// 日志索引名称
String indexName = "16_speaker_history";
LocalDate now = LocalDate.now();
LocalDate sexMonths = now.minusMonths(6);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String halfYearAgoStr = sexMonths.format(formatter);
log.info("删除es日志 日期{}", halfYearAgoStr);
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
// 时间范围查询
boolQueryBuilder.must(QueryBuilders.rangeQuery("createTime").lte(halfYearAgoStr));
DeleteByQueryRequest request = new DeleteByQueryRequest(indexName);
request.setQuery(boolQueryBuilder);
request.setTimeout(TimeValue.timeValueMinutes(2));
client.deleteByQuery(request, RequestOptions.DEFAULT);
}
/**
* 每月15号生成JSON文件
*
* @throws Exception
*/
@Scheduled(cron = "0 0 2 15 * ?")
public void fileDate() throws Exception {
log.info("开始生成es的JSON文件");
// 创建搜索请求
// 获取当前日期
LocalDate now = LocalDate.now();
// 获取本月第一天的日期
LocalDate firstDayOfMonth = now.withDayOfMonth(1);
// 获取本月最后一天的日期
YearMonth yearMonth = YearMonth.from(now);
LocalDate lastDayOfMonth = yearMonth.atEndOfMonth();
// 获取本月第一天的时间
LocalDateTime startTime = LocalDateTime.of(firstDayOfMonth, LocalTime.MIN);
// 获取本月最后一天的时间
LocalDateTime endTime = LocalDateTime.of(lastDayOfMonth, LocalTime.MAX);
// 输出结果
String query = "createTime:[" + startTime + " TO " + endTime + "]";
log.info("query{}", query);
// 创建搜索请求
SearchRequest searchRequest = new SearchRequest(INDEX_NAME);
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
.must(QueryBuilders.rangeQuery("createTime").gte(startTime).lte(endTime));
// 创建查询源// 查询超时时间
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder()
.query(boolQuery)
// 查询结果数量
.size(10000)
.timeout(TimeValue.timeValueSeconds(30));
// 执行搜索请求
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
// 将搜索结果转换为 JSON 数据
XContentBuilder builder = XContentFactory.jsonBuilder();
builder.startArray();
for (SearchHit hit : searchResponse.getHits().getHits()) {
builder.startObject();
for (Map.Entry<String, Object> entry : hit.getSourceAsMap().entrySet()) {
String fieldName = entry.getKey();
Object value = entry.getValue();
if (value != null) {
if (value instanceof Date) {
value = ((Date) value).toInstant().toString();
}
builder.field(fieldName, value);
}
}
builder.endObject();
}
builder.endArray();
// 将 JSON 数据保存到文件
// 获取当前年月
// 格式化日期为字符串
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");
String month = formatter.format(yearMonth);
String json = Strings.toString(builder);
String format = String.format("/home/es/data/json/es-%s-data.json", month);
log.info(format);
Path filePath = Paths.get(format);
Files.createDirectories(filePath.getParent());
try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(format, true), StandardCharsets.UTF_8))) {
writer.write(json);
}
// 关闭 Elasticsearch 客户端
client.close();
}
}
config连接ES
@Bean
public RestHighLevelClient esRestClient() {
//es验证账号密码
final CredentialsProvider provider = new BasicCredentialsProvider();
//填写账号密码
provider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials("elastic", "123456"));
return new RestHighLevelClient(
RestClient.builder(new HttpHost("10.0.0.0", 9200, "http"))
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
httpClientBuilder.disableAuthCaching();
return httpClientBuilder.setDefaultCredentialsProvider(provider);
}
})
.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
@Override
public RequestConfig.Builder customizeRequestConfig(
RequestConfig.Builder requestConfigBuilder) {
return requestConfigBuilder.setConnectTimeout(5000 * 1000) // 连接超时(默认为1秒)
.setSocketTimeout(6000 * 1000);// 套接字超时(默认为30秒)
}
}));
}