缓存初始化

package com.xiaomi.miui.ad.ssp.proxy;

import com.xiaomi.common.perfcounter.PerfCounter;
import com.xiaomi.miui.ad.ssp.common.Constants;
import com.xiaomi.miui.ad.ssp.converter.mockad.MockAdConfigConverter;
import com.xiaomi.miui.ad.ssp.converter.mockad.MockAdInfoConverter;
import com.xiaomi.miui.ad.ssp.model.mockad.MockAdConfig;
import com.xiaomi.miui.ad.ssp.model.mockad.MockAdInfo;
import com.xiaomi.miui.ad.ssp.util.CommonUtils;
import com.xiaomi.miui.ad.ssp.util.HttpGetter;
import com.xiaomi.miui.ad.thrift.model.AdInfo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;

import java.util.*;
import java.util.concurrent.*;

@Slf4j
public class MockAdProxy {
    private static final MockAdProxy proxy = new MockAdProxy();

    public static MockAdProxy getInstance() {
        return proxy;
    }

    // 假广告配置缓存
    private Map<String, MockAdConfig> mockAdConfigCache = new HashMap<String, MockAdConfig>();
    // 假广告缓存
    private Map<String, MockAdInfo> mockAdInfoCache = new HashMap<String, MockAdInfo>();

    private Random ran = new Random();

    static {
        proxy.startTask();
    }

    // 每一分钟更新一次缓存
    private void startTask() {
        Runnable mockAdConfigTask = new MockAdConfigUpdater();
        Runnable mockAdInfoTask = new MockAdInfoUpdater();
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
        scheduledExecutorService.scheduleAtFixedRate(mockAdConfigTask, 0, 1, TimeUnit.MINUTES);
        scheduledExecutorService.scheduleAtFixedRate(mockAdInfoTask, 0, 1, TimeUnit.MINUTES);
    }

    private class MockAdConfigUpdater implements Runnable {
        @Override
        public void run() {
            log.info("Start get mockAdConfig from tools ...");
            try {
                long startTS = System.currentTimeMillis();
                String url = CommonUtils.getSspServiceHost() + Constants.HttpPath.MOCK_AD_CONFIG;
                String ret = HttpGetter.send(url);
                PerfCounter.count("ad.tools.mockad.config.http.get", 1L, System.currentTimeMillis() - startTS);

                List<MockAdConfig> mockAdConfigList = new ArrayList<MockAdConfig>();
                boolean isSucc = MockAdConfigConverter.convert(ret, mockAdConfigList);

                if (isSucc) {
                    Map<String, MockAdConfig> tmpMockAdConfigCache = new HashMap<String, MockAdConfig>();
                    for (MockAdConfig mockAdConfig : mockAdConfigList) {
                        if (mockAdConfig != null && StringUtils.isNotEmpty(mockAdConfig.getPlacementId())
                                && CollectionUtils.isNotEmpty(mockAdConfig.getTargetImeiSet())) {
                            tmpMockAdConfigCache.put(mockAdConfig.getPlacementId(), mockAdConfig);
                        }
                    }
                    mockAdConfigCache = tmpMockAdConfigCache;
                }
            } catch (Exception e) {
                log.error("get mockAdConfig from tools error");
            }
            log.info("Finish get mockAdConfig from tools task, cache size is {}", mockAdConfigCache.size());
        }
    }

    private class MockAdInfoUpdater implements Runnable {
        @Override
        public void run() {
            log.info("Start get mockAdInfo from tools ...");
            try {
                long startTS = System.currentTimeMillis();
                String url = CommonUtils.getSspServiceHost() + Constants.HttpPath.MOCK_AD_INFO;
                String ret = HttpGetter.send(url);
                PerfCounter.count("ad.tools.mockad.info.http.get", 1L, System.currentTimeMillis() - startTS);

                List<MockAdInfo> mockAdInfoList = new ArrayList<MockAdInfo>();
                boolean isSucc = MockAdInfoConverter.convert(ret, mockAdInfoList);

                if (isSucc) {
                    Map<String, MockAdInfo> tmpMockAdInfoCache = new HashMap<String, MockAdInfo>();
                    for (MockAdInfo mockAdInfo : mockAdInfoList) {
                        if (mockAdInfo != null && StringUtils.isNotEmpty(mockAdInfo.getName())) {
                            tmpMockAdInfoCache.put(mockAdInfo.getName(), mockAdInfo);
                        }
                    }
                    mockAdInfoCache = tmpMockAdInfoCache;

                }
            } catch (Exception e) {
                log.error("get mockAdInfo from tools error");
            }
            log.info("Finish get mockAdInfo from tools task, cache size is {}", mockAdInfoCache.size());
        }
    }

    public boolean isSetMockAd(String imei, String placementId) {
        if (!mockAdConfigCache.containsKey(placementId)) {
            return false;
        }
        MockAdConfig mockAdConfig = mockAdConfigCache.get(placementId);
        return mockAdConfig != null && mockAdConfig.getTargetImeiSet().contains(imei);
    }

    public List<AdInfo> getMockAdInfoList(String imei, String placementId) {
        if (!isSetMockAd(imei, placementId)) {
            return Collections.EMPTY_LIST;
        }

        MockAdConfig mockAdConfig = mockAdConfigCache.get(placementId);
        if (mockAdConfig == null || CollectionUtils.isEmpty(mockAdConfig.getAdNameLists())) {
            return Collections.EMPTY_LIST;
        }

        int random = ran.nextInt(mockAdConfig.getAdNameLists().size());
        List<String> adNameList = mockAdConfig.getAdNameLists().get(random);
        if (CollectionUtils.isEmpty(adNameList)) {
            return Collections.EMPTY_LIST;
        }
        List<AdInfo> adInfos = new ArrayList<AdInfo>();
        Map<String, MockAdInfo> tmpMockAdInfoCache = mockAdInfoCache;
        for (String adName : adNameList) {
            if (StringUtils.isNotEmpty(adName) && tmpMockAdInfoCache.containsKey(adName)
                    && tmpMockAdInfoCache.get(adName) != null) {
                adInfos.add(tmpMockAdInfoCache.get(adName).getAdInfo().deepCopy());
            }
        }
        return adInfos;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值