ApplicationCacheGuavaService.java 3.1 KB
Newer Older
P
peng-yongsheng 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/*
 * Copyright 2017, OpenSkywalking Organization All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * Project repository: https://github.com/OpenSkywalking/skywalking
 */

19
package org.skywalking.apm.collector.cache.guava.service;
P
peng-yongsheng 已提交
20 21 22

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
23
import org.skywalking.apm.collector.cache.service.ApplicationCacheService;
P
peng-yongsheng 已提交
24 25 26
import org.skywalking.apm.collector.core.util.Const;
import org.skywalking.apm.collector.core.util.StringUtils;
import org.skywalking.apm.collector.storage.dao.IApplicationCacheDAO;
27
import org.skywalking.apm.collector.storage.service.DAOService;
P
peng-yongsheng 已提交
28 29 30 31 32 33
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author peng-yongsheng
 */
34
public class ApplicationCacheGuavaService implements ApplicationCacheService {
P
peng-yongsheng 已提交
35

36
    private final Logger logger = LoggerFactory.getLogger(ApplicationCacheGuavaService.class);
P
peng-yongsheng 已提交
37

38
    private final Cache<String, Integer> CODE_CACHE = CacheBuilder.newBuilder().initialCapacity(100).maximumSize(1000).build();
P
peng-yongsheng 已提交
39

40 41 42 43 44 45 46 47
    private final DAOService daoService;

    public ApplicationCacheGuavaService(DAOService daoService) {
        this.daoService = daoService;
    }

    public int get(String applicationCode) {
        IApplicationCacheDAO dao = (IApplicationCacheDAO)daoService.get(IApplicationCacheDAO.class);
P
peng-yongsheng 已提交
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64

        int applicationId = 0;
        try {
            applicationId = CODE_CACHE.get(applicationCode, () -> dao.getApplicationId(applicationCode));
        } catch (Throwable e) {
            logger.error(e.getMessage(), e);
        }

        if (applicationId == 0) {
            applicationId = dao.getApplicationId(applicationCode);
            if (applicationId != 0) {
                CODE_CACHE.put(applicationCode, applicationId);
            }
        }
        return applicationId;
    }

65
    private final Cache<Integer, String> ID_CACHE = CacheBuilder.newBuilder().maximumSize(1000).build();
P
peng-yongsheng 已提交
66

67 68
    public String get(int applicationId) {
        IApplicationCacheDAO dao = (IApplicationCacheDAO)daoService.get(IApplicationCacheDAO.class);
P
peng-yongsheng 已提交
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85

        String applicationCode = Const.EMPTY_STRING;
        try {
            applicationCode = ID_CACHE.get(applicationId, () -> dao.getApplicationCode(applicationId));
        } catch (Throwable e) {
            logger.error(e.getMessage(), e);
        }

        if (StringUtils.isEmpty(applicationCode)) {
            applicationCode = dao.getApplicationCode(applicationId);
            if (StringUtils.isNotEmpty(applicationCode)) {
                CODE_CACHE.put(applicationCode, applicationId);
            }
        }
        return applicationCode;
    }
}