package org.example.timedTask; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.google.gson.Gson; import lombok.extern.slf4j.Slf4j; import org.example.dao.StockNewShareMapper; import org.example.enums.EStockType; import org.example.pojo.StockNewShare; import org.example.util.HttpClientRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.function.Function; import java.util.stream.Collectors; /** * @program: webSocketProject * @description: 新股 * @create: 2024-03-27 13:14 **/ @Component @Slf4j public class NewShareTask { private final Lock lock = new ReentrantLock(); @Autowired StockNewShareMapper stockNewShareMapper; /* * ipo、新股日历抓取 * */ @Scheduled(cron = "0 0/1 * * * ? ") public void get() { if (lock.tryLock()) { log.info("ipo、新股日历抓取--------->开始"); try { newShare(EStockType.IN); } finally { lock.unlock(); log.info("ipo、新股日历抓取--------->结束"); } } else { log.info("ipo、新股日历抓取--------->上次任务还未执行完成,本次任务忽略"); } } public void newShare(EStockType e) { String result = HttpClientRequest.doGet(e.stockUrl + "new-stock?country_id=" + e.getContryId() + "&key=" + e.stockKey); JSONArray jsonArray = JSONArray.parseArray(result); List list = jsonArray.stream().map(stock -> JSONUtil.toBean(stock.toString(), StockNewShare.class)).collect(Collectors.toList()); List pidList = list.stream().map(StockNewShare::getPid).collect(Collectors.toList()); List shareList = stockNewShareMapper.selectList(new LambdaQueryWrapper().in(StockNewShare::getPid, pidList)); Map resultMap = shareList.stream() .collect(Collectors.toMap(StockNewShare::getPid, Function.identity())); list.forEach(f -> { StockNewShare share = resultMap.get(f.getPid()); if (share == null) { stockNewShareMapper.insert(f); } else { f.setId(share.getId()); stockNewShareMapper.updateById(f); } }); } }