StockInfoService.java 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package com.danielbohry.stocks.service;
  2. import com.danielbohry.stocks.client.FinanceClient;
  3. import com.danielbohry.stocks.domain.Quote;
  4. import com.danielbohry.stocks.domain.StockInfo;
  5. import com.danielbohry.stocks.exception.NotFoundException;
  6. import com.danielbohry.stocks.repository.StockInfoRepository;
  7. import com.danielbohry.stocks.repository.StockRepository;
  8. import lombok.AllArgsConstructor;
  9. import lombok.extern.slf4j.Slf4j;
  10. import org.springframework.cache.annotation.Cacheable;
  11. import org.springframework.scheduling.annotation.Async;
  12. import org.springframework.stereotype.Service;
  13. import java.util.List;
  14. import java.util.Set;
  15. import static java.util.stream.Collectors.toSet;
  16. @Slf4j
  17. @Service
  18. @AllArgsConstructor
  19. public class StockInfoService {
  20. private FinanceClient client;
  21. private StockRepository stockRepository;
  22. private StockInfoRepository infoRepository;
  23. @Cacheable(value = "stockInfo", key = "#code")
  24. public StockInfo get(String code) {
  25. return infoRepository.findById(code)
  26. .orElseThrow(() -> new NotFoundException("No stock found with id: " + code));
  27. }
  28. @Async("stockInfoExecutor")
  29. public void generate() {
  30. List<Quote> stocks = stockRepository.findAll();
  31. Set<String> existingIds = infoRepository.findAllById(
  32. stocks.stream()
  33. .map(Quote::getCode)
  34. .collect(toSet())
  35. ).stream()
  36. .map(StockInfo::getCode)
  37. .collect(toSet());
  38. List<Quote> request = stocks.stream()
  39. .filter(stock -> !existingIds.contains(stock.getCode()))
  40. .filter(stock -> !stock.getCode().contains(":"))
  41. .toList();
  42. int batchSize = 20;
  43. for (int i = 0; i < request.size(); i += batchSize) {
  44. int end = Math.min(i + batchSize, request.size());
  45. List<Quote> batch = request.subList(i, end);
  46. List<StockInfo> stockInfos = client.fetchStockInfo(batch);
  47. infoRepository.saveAll(stockInfos);
  48. }
  49. }
  50. }