|
@@ -15,16 +15,16 @@ import com.qhtx.eta.domain.facade.ETAFacadeService;
|
|
import com.qhtx.eta.domain.service.DWIndexFrameService;
|
|
import com.qhtx.eta.domain.service.DWIndexFrameService;
|
|
import com.qhtx.eta.domain.service.ETAPushDataService;
|
|
import com.qhtx.eta.domain.service.ETAPushDataService;
|
|
import com.qhtx.eta.infra.entity.dw.TEtaIndexPushTask;
|
|
import com.qhtx.eta.infra.entity.dw.TEtaIndexPushTask;
|
|
-import com.qhtx.eta.infra.service.TEtaIndexPushTaskService;
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
import javax.annotation.Resource;
|
|
-import java.text.ParseException;
|
|
|
|
import java.text.SimpleDateFormat;
|
|
import java.text.SimpleDateFormat;
|
|
import java.util.Comparator;
|
|
import java.util.Comparator;
|
|
import java.util.Date;
|
|
import java.util.Date;
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
|
+import java.util.concurrent.CompletableFuture;
|
|
|
|
+import java.util.concurrent.atomic.AtomicInteger;
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -46,27 +46,58 @@ public class ETAFacadeServiceImpl implements ETAFacadeService {
|
|
@Override
|
|
@Override
|
|
@DomainTransDataSource(dataSourceType = DataSourceType.DW)
|
|
@DomainTransDataSource(dataSourceType = DataSourceType.DW)
|
|
public void pushIndex(String indexCode) {
|
|
public void pushIndex(String indexCode) {
|
|
- DWIndexDTO dwIndexDTO = dwIndexFrameService.pushIndexToEta(indexCode);
|
|
|
|
- if (dwIndexDTO.getDataList().size() > ETAConstants.ETA_PUSH_DATA_LIMIT) {
|
|
|
|
- log.info("数据量超过限制,分批推送");
|
|
|
|
- List<DWIndexDataDTO> sortList = dwIndexDTO.getDataList().stream().sorted(Comparator.comparing(DWIndexDataDTO::getDate)).collect(Collectors.toList());
|
|
|
|
- Lists.partition(sortList, ETAConstants.ETA_PUSH_DATA_LIMIT).forEach(dataList -> {
|
|
|
|
- Date latestDataDate = dataList.stream().map(item -> item.getDate()).max(Comparator.comparing(Date::getTime)).get();
|
|
|
|
- //防止数据漏更新,先推送,再更新本地任务记录,下游做好冗余和幂等
|
|
|
|
- DWIndexDTO dataDTO = new DWIndexDTO();
|
|
|
|
- dataDTO.setIndexCode(dwIndexDTO.getIndexCode());
|
|
|
|
- dataDTO.setFrequency(dwIndexDTO.getFrequency());
|
|
|
|
- dataDTO.setIndexName(dwIndexDTO.getIndexName());
|
|
|
|
- dataDTO.setRemark(dwIndexDTO.getRemark());
|
|
|
|
- dataDTO.setSourceName(dwIndexDTO.getSourceName());
|
|
|
|
- dataDTO.setDataList(dataList);
|
|
|
|
- apiServiceHolder.runApi(ETAInterfaceEnum.PUSH_ETA_INDEX, dataDTO);
|
|
|
|
- TEtaIndexPushTask tEtaIndexPushTask = etaPushDataService.getETAPushTaskByIndexCode(dataDTO.getIndexCode());
|
|
|
|
- tEtaIndexPushTask.setLatestDataDate(new SimpleDateFormat(ETAConstants.DATE_PATTERN).format(latestDataDate));
|
|
|
|
- tEtaIndexPushTask.setDataCount(dataList.size());
|
|
|
|
- dataDTO.setDataList(dataList);
|
|
|
|
- });
|
|
|
|
- }
|
|
|
|
- apiServiceHolder.runApi(ETAInterfaceEnum.PUSH_ETA_INDEX, dwIndexDTO);
|
|
|
|
|
|
+ DWIndexDTO dwIndexDTO = dwIndexFrameService.addSyncIndex(indexCode);
|
|
|
|
+
|
|
|
|
+ CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
|
|
|
|
+ List<DWIndexDataDTO> dataList = dwIndexFrameService.getIndexData(indexCode);
|
|
|
|
+ dwIndexDTO.setDataList(dataList);
|
|
|
|
+ //api数据发送
|
|
|
|
+ if (dwIndexDTO.getDataList().size() > ETAConstants.ETA_PUSH_DATA_LIMIT) {
|
|
|
|
+ log.info("数据量超过限制,分批推送");
|
|
|
|
+ List<DWIndexDataDTO> sortList = dwIndexDTO.getDataList().stream().sorted(Comparator.comparing(DWIndexDataDTO::getDate)).collect(Collectors.toList());
|
|
|
|
+ Lists.partition(sortList, ETAConstants.ETA_PUSH_DATA_CHUNK).forEach(list -> {
|
|
|
|
+ Date latestDataDate = list.stream().map(DWIndexDataDTO::getDate).max(Comparator.comparing(Date::getTime)).get();
|
|
|
|
+ //防止数据漏更新,先推送,再更新本地任务记录,下游做好冗余和幂等
|
|
|
|
+ DWIndexDTO dataDTO = new DWIndexDTO();
|
|
|
|
+ dataDTO.setIndexCode(dwIndexDTO.getIndexCode());
|
|
|
|
+ dataDTO.setFrequency(dwIndexDTO.getFrequency());
|
|
|
|
+ dataDTO.setIndexName(dwIndexDTO.getIndexName());
|
|
|
|
+ dataDTO.setRemark(dwIndexDTO.getRemark());
|
|
|
|
+ dataDTO.setSourceName(dwIndexDTO.getSourceName());
|
|
|
|
+ dataDTO.setUnit(dwIndexDTO.getUnit());
|
|
|
|
+ dataDTO.setDataList(list);
|
|
|
|
+ List<?> result = apiServiceHolder.runApi(ETAInterfaceEnum.PUSH_ETA_INDEX, dataDTO);
|
|
|
|
+ if (result == null) {
|
|
|
|
+ log.error("调用ETA接口失败,停止更新");
|
|
|
|
+ throw new ETAException(ErrorEnum.PUSH_TO_ETA_ERROR);
|
|
|
|
+ }
|
|
|
|
+ try {
|
|
|
|
+ Thread.sleep(500);
|
|
|
|
+ } catch (InterruptedException e) {
|
|
|
|
+ log.warn("线程中断异常");
|
|
|
|
+ }
|
|
|
|
+ TEtaIndexPushTask tEtaIndexPushTask = etaPushDataService.getETAPushTaskByIndexCode(dataDTO.getIndexCode());
|
|
|
|
+ if (tEtaIndexPushTask == null) {
|
|
|
|
+ log.error("未找到对应指标任务记录:{}", dataDTO.getIndexCode());
|
|
|
|
+ throw new ETAException(ErrorEnum.INDEX_UPDATE_ERROR);
|
|
|
|
+ }
|
|
|
|
+ tEtaIndexPushTask.setLatestDataDate(new SimpleDateFormat(ETAConstants.DATE_PATTERN).format(latestDataDate));
|
|
|
|
+ int currentCount = tEtaIndexPushTask.getDataCount() == null ? 0 : tEtaIndexPushTask.getDataCount();
|
|
|
|
+ tEtaIndexPushTask.setDataCount(currentCount + list.size());
|
|
|
|
+ tEtaIndexPushTask.setUpdateTime(new Date());
|
|
|
|
+ tEtaIndexPushTask.setLastPushTime(new Date());
|
|
|
|
+ etaPushDataService.updateTaskByIndexCode(tEtaIndexPushTask);
|
|
|
|
+ });
|
|
|
|
+ } else {
|
|
|
|
+ apiServiceHolder.runApi(ETAInterfaceEnum.PUSH_ETA_INDEX, dwIndexDTO);
|
|
|
|
+ }
|
|
|
|
+ }).thenRun(() -> {
|
|
|
|
+ log.info("更新指标任务表完成");
|
|
|
|
+ });
|
|
|
|
+ future.exceptionally(exception -> {
|
|
|
|
+ log.error("更新指标任务表失败:", exception);
|
|
|
|
+ return null;
|
|
|
|
+ });
|
|
|
|
+
|
|
}
|
|
}
|
|
}
|
|
}
|