定时任务操作删除elasticsearch数据文件和下载保存数据

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秒)
                            }
                        }));
    }


 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值