1.线程池配置
@SpringBootApplication
public class CryptoApplication {
public static void main(String[] args) {
SpringApplication.run(CryptoApplication.class, args);
}
@EnableAsync
@Configuration
class TaskPoolConfig {
@Bean("backExecutor")
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(20);
executor.setQueueCapacity(5);
executor.setKeepAliveSeconds(60);
executor.setThreadNamePrefix("backExecutor-");
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());
executor.initialize();
return executor;
}
}
}
2.异步方法
@Async("backExecutor")
public CompletableFuture<R> getRate(List<LatestCurrencyPriceRes> latestCurrencyPriceResList, ExchangeInfoEntity exchangeInfoEntity) {
LatestCurrencyPriceRes latestCurrencyPriceRes = new LatestCurrencyPriceRes();
NewQuotedPriceResVo newQuotedPriceResVo = coreCustomerInfoService.newQuotedPrice(exchangeInfoEntity.getExchangeId());
latestCurrencyPriceRes.setExchangeId(exchangeInfoEntity.getExchangeId());
latestCurrencyPriceRes.setExchangeName(exchangeInfoEntity.getExchangeName());
if (CoreErrorCodeEnum.SUCCESS.getValue().equals(newQuotedPriceResVo.getCoreResCode())) {
latestCurrencyPriceRes.setListQuotedPrice(newQuotedPriceResVo.getListQuotedPrice());
} else {
return CompletableFuture.completedFuture(R.error(newQuotedPriceResVo.getCoreResMsg()));
}
VirtualCurrencyPriceEntity virtualCurrencyPriceEntityUSD2USDC =
virtualCurrencyPriceDao.selectByFrom2ToCurrency(CurrencyTypeEnum.USD.getValue(), CurrencyTypeEnum.USDC.getValue());
if (virtualCurrencyPriceEntityUSD2USDC != null) {
QuotedPriceVo quotedPriceVoUSD2USDC = new QuotedPriceVo();
quotedPriceVoUSD2USDC.setCurrency(CurrencyTypeEnum.USD);
quotedPriceVoUSD2USDC.setPrice(virtualCurrencyPriceEntityUSD2USDC.getActualPrice());
quotedPriceVoUSD2USDC.setContrastCurrency(CurrencyTypeEnum.USDC);
quotedPriceVoUSD2USDC.setTime(virtualCurrencyPriceEntityUSD2USDC.getCreateTime());
latestCurrencyPriceRes.getListQuotedPrice().add(quotedPriceVoUSD2USDC);
}
VirtualCurrencyPriceEntity virtualCurrencyPriceEntityUSDC2USD =
virtualCurrencyPriceDao.selectByFrom2ToCurrency(CurrencyTypeEnum.USDC.getValue(), CurrencyTypeEnum.USD.getValue());
if (virtualCurrencyPriceEntityUSDC2USD != null) {
QuotedPriceVo quotedPriceVoUSDC2USD = new QuotedPriceVo();
quotedPriceVoUSDC2USD.setCurrency(CurrencyTypeEnum.USDC);
quotedPriceVoUSDC2USD.setPrice(virtualCurrencyPriceEntityUSDC2USD.getActualPrice());
quotedPriceVoUSDC2USD.setContrastCurrency(CurrencyTypeEnum.USD);
quotedPriceVoUSDC2USD.setTime(virtualCurrencyPriceEntityUSDC2USD.getCreateTime());
latestCurrencyPriceRes.getListQuotedPrice().add(quotedPriceVoUSDC2USD);
}
latestCurrencyPriceResList.add(latestCurrencyPriceRes);
return CompletableFuture.completedFuture(null);
}
3.返回处理
public R latestCurrencyPrice() {
List<LatestCurrencyPriceRes> latestCurrencyPriceResList = new CopyOnWriteArrayList<>();
List<ExchangeInfoEntity> exchangeInfoEntityList = exchangeInfoService.list(new QueryWrapper<ExchangeInfoEntity>().lambda()
.orderByDesc(ExchangeInfoEntity::getUpdateTime));
if (CollectionUtil.isNotEmpty(exchangeInfoEntityList)) {
List<CompletableFuture> asyncResultList = new CopyOnWriteArrayList<>();
for (ExchangeInfoEntity exchangeInfoEntity : exchangeInfoEntityList) {
CompletableFuture<R> asyncResult = asyncService.getRate(latestCurrencyPriceResList, exchangeInfoEntity);
asyncResultList.add(asyncResult);
}
if (CollectionUtil.isNotEmpty(asyncResultList)) {
CompletableFuture<R>[] completableFutures = asyncResultList.toArray(new CompletableFuture[asyncResultList.size()]);
CompletableFuture.allOf(completableFutures).join();
for (CompletableFuture<R> completableFuture : completableFutures) {
try {
if (completableFuture.get() != null) {
R r = completableFuture.get();
log.error("获取汇率失败:" + r.get("msg").toString());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
return R.ok().put("result", latestCurrencyPriceResList);
}