2

たとえば、キャッシュを次のように構成します。

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;
    }
}
4

2 に答える 2

2

現在、パブリック API を使用してキャッシュ エントリの TTL 値を取得する方法は他にありません。ただし、そのようなヘルパー メソッドが存在する場合、ほとんどの場合は同様の方法で実装されますが、TTL は 1 回だけ計算され、次のメソッドの呼び出しに対して同じ値が返されます。

したがって、TTL を 1 回だけ計算するだけでコードを改善でき、より最適になります。また、パブリック API に同様のメソッドを追加することを提案している Ignite コミュニティにいつでも連絡できます。

于 2016-05-21T07:54:59.800 に答える
2

dmagda の提案 (乾杯) に従い、Ignite コミュニティに連絡しました。Apache Ignite Users フォーラムのAndreyVel のアドバイスによると、現在、ハッキングせずに 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() メソッドを使用して作成されたかどうかを確認する方法はありません。

彼は、IgniteCache に getExpiryPolicy() を追加しても問題ないと考えています。これは、これがデフォルトのキャッシュ インスタンスである場合は構成済みの有効期限ポリシー (おそらく null) を返し、キャッシュ インスタンスが withExpiryPolicy() を使用して作成された場合はユーザー指定の有効期限ポリシーを返します。

これを Ignite 開発者リストにクロスポストして、開発者コミュニティの考えを確認してください。

于 2016-06-29T16:25:10.807 に答える