| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- package nju.seec.helper.api.bok;
- import com.google.common.collect.ImmutableMap;
- import com.google.common.collect.Lists;
- import com.google.common.collect.Maps;
- import com.google.gson.reflect.TypeToken;
- import lombok.Data;
- import nju.seec.helper.api.bok.vo.QuestionVO;
- import nju.seec.helper.util.JsonUtils;
- import nju.seec.helper.util.RestRequestUtil;
- import nju.seec.helper.util.cache.CaffeineCacheUtils;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.boot.context.properties.ConfigurationProperties;
- import org.springframework.stereotype.Component;
- import java.util.List;
- import java.util.Map;
- import java.util.stream.Collectors;
- /**
- * @author cst
- */
- @Component
- @ConfigurationProperties("bok.question-query")
- @Data
- public class QuestionQueryApi {
- @Value("${bok.question-cache-name}")
- private String bokQuestionCacheName;
- private final RestRequestUtil restRequestUtil;
- private final CaffeineCacheUtils cacheUtils;
- private String byIdUrl;
- public QuestionQueryApi(RestRequestUtil restRequestUtil, CaffeineCacheUtils cacheUtils) {
- this.restRequestUtil = restRequestUtil;
- this.cacheUtils = cacheUtils;
- }
- @SuppressWarnings({"unchecked", "rawtypes"})
- public List<QuestionVO> getQuestionListById(final List<String> ids) {
- Map<String, QuestionVO> bokQuestionsMap = Maps.newHashMapWithExpectedSize(ids.size());
- final Map<String, QuestionVO> cacheBokQuestionsMap = (Map) cacheUtils.multiGet(bokQuestionCacheName, ids);
- bokQuestionsMap.putAll(cacheBokQuestionsMap);
- List<String> requestIds = Lists.newArrayList(ids);
- requestIds.removeAll(cacheBokQuestionsMap.keySet());
- //未缓存的去这里拿
- if (!requestIds.isEmpty()) {
- Map<String, String> uriVariables = ImmutableMap.of("id", requestIds.stream().reduce((a, b) -> a + "," + b).orElse(""));
- List<QuestionVO> questionVOList = JsonUtils.fromJson(restRequestUtil.sendGetRequest(byIdUrl, String.class, uriVariables), new TypeToken<List<QuestionVO>>() {
- });
- Map<String, QuestionVO> remoteBokQuestionsMap = questionVOList.parallelStream().collect(Collectors.toMap(QuestionVO::getId, bokQuestion -> bokQuestion));
- bokQuestionsMap.putAll(remoteBokQuestionsMap);
- cacheUtils.setAll(bokQuestionCacheName, (Map) remoteBokQuestionsMap);
- }
- return ids.stream()
- .map(bokQuestionsMap::get)
- .collect(Collectors.toList());
- }
- }
|