Как получить конфигурацию данного кеша в Apache Ignite?

Например, я настраиваю кеш следующим образом:

public IgniteCache<String, Object> getOrCreateCache(String cacheName) {
    Ignite ignite = Ignition.ignite();

    CacheConfiguration<String, Object> cacheCfg = new CacheConfiguration<String, Object>(cacheName);
    cacheCfg.setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(new Duration(TimeUnit.SECONDS, 30)));

    IgniteCache<String, Object> igniteCache = ignite.getOrCreateCache(cacheCfg);
    return igniteCache;     
}

Что, если позже я захочу узнать продолжительность политики истечения срока действия из возвращенного igniteCache. Я могу сделать это следующим хакерским способом, но это некрасиво и не может быть правильным способом:

import javax.cache.configuration.Factory;
import javax.cache.expiry.CreatedExpiryPolicy;
import javax.cache.expiry.Duration;

import org.apache.ignite.IgniteCache;
import org.apache.ignite.configuration.CacheConfiguration;

public class IgniteCacheManager {

    private IgniteCache<String, Object> igniteCache;

    public IgniteCacheManager(IgniteCache<String, Object> igniteCache) {
        this.igniteCache = igniteCache;
    }

    public long getTimeToLive() {
        long timeToLive = 0;
        CacheConfiguration configuration = igniteCache.getConfiguration(CacheConfiguration.class);
        Factory factory = configuration.getExpiryPolicyFactory();
        Object obj = factory.create();
        if (obj instanceof CreatedExpiryPolicy) {
            CreatedExpiryPolicy cep = (CreatedExpiryPolicy)obj;
            Duration dur = cep.getExpiryForCreation();
            timeToLive = dur.getDurationAmount();
        }
        return timeToLive;
    }
}

Версия Apache Ignite, над которой я работаю, — 1.5.0.final.

Кстати, в Ehcache я могу просто получить конфигурацию следующим образом:

import net.sf.ehcache.Cache;
import net.sf.ehcache.config.CacheConfiguration;

public class EhcacheCacheManager {

    private Cache cache;

    public EhcacheCacheManager(Cache cache) {
        this.cache = cache;
    }

    public long getTimeToLive() {
        long timeToLive = 0;

        CacheConfiguration config = cache.getCacheConfiguration();
        timeToLive = config.getTimeToLiveSeconds();
        return timeToLive;
    }
}

person Yuci    schedule 20.05.2016    source источник


Ответы (2)


В настоящее время я не вижу другого способа получить значение TTL для записей в кеше с помощью общедоступного API. Однако, если бы такой вспомогательный метод существовал, скорее всего, он был бы реализован так же, как и вы, но он вычислял бы TTL только один раз, возвращая одно и то же значение для следующих вызовов метода.

Таким образом, вы можете просто улучшить свой код, рассчитав TTL только один раз, и он станет более оптимальным. Также вы всегда можете обратиться к сообществу Ignite с предложением добавить аналогичные методы в общедоступный API.

person dmagda    schedule 21.05.2016

Следуя предложению dmagda (ура), я обратился к сообществу Ignite. По совету AndreyVel из форум пользователей Apache Ignite, в настоящее время мы можем получить ExpiryPolicy без взлома:

import javax.cache.configuration.Factory;
import javax.cache.expiry.ExpiryPolicy;

import org.apache.ignite.IgniteCache;
import org.apache.ignite.configuration.CacheConfiguration;

public class IgniteCacheManager {

    private IgniteCache<String, Object> igniteCache;

    public IgniteCacheManager(IgniteCache<String, Object> igniteCache) {
        this.igniteCache = igniteCache;
    }

    public long getTimeToLive() {
        CacheConfiguration configuration = igniteCache.getConfiguration(CacheConfiguration.class);
        Factory factory = configuration.getExpiryPolicyFactory();
        ExpiryPolicy policy = factory.create(); 
        long timeToLive = policy.getExpiryForCreation().getDurationAmount();
        return timeToLive;
    }
}

Также комментарий от alexey.goncharuk на форуме о том, что он согласен с тем, что этот способ немного неудобен и распространяется только на настроенную ExpiryPolicy, в настоящее время нет возможности проверить, был ли экземпляр IgniteCache создан с помощью метода withExpiryPolicy().

Он считает, что можно добавить getExpiryPolicy() в IgniteCache, который вернет настроенную политику истечения срока действия (возможно, null), если это экземпляр кеша по умолчанию, и указанную пользователем политику истечения срока действия, если экземпляр кеша был создан с использованием withExpiryPolicy().

Разместите это в списке разработчиков Ignite, чтобы увидеть, что сообщество разработчиков думает.

person Yuci    schedule 29.06.2016