RecallConfigCommonService.java 3.82 KB
package com.yoho.search.recall.config;

import com.alibaba.fastjson.JSON;
import com.yoho.search.dal.model.CsRecallConfigCommon;
import com.yoho.search.service.base.index.CsRecallConfigCommonIndexBaseService;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

@Component
class RecallConfigCommonService {

    private static final Logger logger = LoggerFactory.getLogger(RecallConfigCommonService.class);

    @Autowired
    private CsRecallConfigCommonIndexBaseService csRecallConfigCommonIndexBaseService;

    private ScheduledExecutorService schedule = Executors.newSingleThreadScheduledExecutor();

    private Map<String, Map<Integer, ConfigSizeInterval>> typePageConfigCache = new HashMap<>();

    @PostConstruct
    void init() {
        schedule.scheduleAtFixedRate(() -> loadConfig(), 0, 1, TimeUnit.MINUTES);
    }

    private void loadConfig() {
        try {
            List<CsRecallConfigCommon> configList = csRecallConfigCommonIndexBaseService.queryAll();
            Map<String, Map<Integer, ConfigSizeInterval>> temp = new HashMap<>();
            for (CsRecallConfigCommon csRecallConfigCommon : configList) {
                Map<Integer, ConfigSizeInterval> pageConfigs = temp.get(csRecallConfigCommon.getConfigType());
                if (pageConfigs == null) {
                    pageConfigs = new HashMap<>();
                    temp.put(csRecallConfigCommon.getConfigType(), pageConfigs);
                }
                int size  = csRecallConfigCommon.getSize();
                int interval = csRecallConfigCommon.getInterval();
                pageConfigs.put(csRecallConfigCommon.getConfigPage(), new ConfigSizeInterval(size, interval));
            }
            typePageConfigCache = temp;
            System.out.println(JSON.toJSONString(typePageConfigCache));
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }
    }

    private ConfigSizeInterval queryCommonConfig(String configKey, int configPage) {
        Map<Integer, ConfigSizeInterval> pageConfigMap = typePageConfigCache.get(configKey);
        if (pageConfigMap == null) {
            return null;
        }
        ConfigSizeInterval pageConfig = pageConfigMap.get(configPage);
        if (pageConfig == null) {
            pageConfig = pageConfigMap.get(RecallConfigConstants.DEFAULT_PAGE_ID);
        }
        if (pageConfigMap == null) {
            return null;
        } else {
            return pageConfig;
        }
    }

    /**
     * 获取配置的大小
     *
     * @param pageId
     * @param configKey
     * @param defaultSize
     * @return
     */
    public int queryConfigSize(int pageId, String configKey, int defaultSize) {
        if (StringUtils.isBlank(configKey)) {
            return defaultSize;
        }
        ConfigSizeInterval config = queryCommonConfig(configKey, pageId);
        return config == null ? defaultSize : config.getSize();
    }

    /**
     * 获取配置的间隔
     *
     * @param pageId
     * @param configKey
     * @param defaultInterval
     * @return
     */
    public int queryConfigInterval(int pageId, String configKey, int defaultInterval) {
        if (StringUtils.isBlank(configKey)) {
            return defaultInterval;
        }
        ConfigSizeInterval config = queryCommonConfig(configKey, pageId);
        return config == null ? defaultInterval : config.getInterval();
    }

}