package com.yupi.springbootinit.job.cycle; import com.yupi.springbootinit.esdao.PostEsDao; import com.yupi.springbootinit.mapper.PostMapper; import com.yupi.springbootinit.model.dto.post.PostEsDTO; import com.yupi.springbootinit.model.entity.Post; import java.util.Date; import java.util.List; import java.util.stream.Collectors; import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; import cn.hutool.core.collection.CollUtil; import org.springframework.scheduling.annotation.Scheduled; /** * 增量同步帖子到 es * * @author 程序员鱼皮 * @from 编程导航知识星球 */ // todo 取消注释开启任务 //@Component @Slf4j public class IncSyncPostToEs { @Resource private PostMapper postMapper; @Resource private PostEsDao postEsDao; /** * 每分钟执行一次 */ @Scheduled(fixedRate = 60 * 1000) public void run() { // 查询近 5 分钟内的数据 Date fiveMinutesAgoDate = new Date(new Date().getTime() - 5 * 60 * 1000L); List postList = postMapper.listPostWithDelete(fiveMinutesAgoDate); if (CollUtil.isEmpty(postList)) { log.info("no inc post"); return; } List postEsDTOList = postList.stream() .map(PostEsDTO::objToDto) .collect(Collectors.toList()); final int pageSize = 500; int total = postEsDTOList.size(); log.info("IncSyncPostToEs start, total {}", total); for (int i = 0; i < total; i += pageSize) { int end = Math.min(i + pageSize, total); log.info("sync from {} to {}", i, end); postEsDao.saveAll(postEsDTOList.subList(i, end)); } log.info("IncSyncPostToEs end, total {}", total); } }