簡體   English   中英

如何在Apache Ignite中獲取給定緩存的配置?

[英]How to get the configuration of a given cache in 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中找出到期策略的持續時間。 我可以用下面的hacky方式做到這一點,但它很難看,並且不是正確的方法:

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

目前我沒有看到任何其他方法來獲取公共API的緩存條目的TTL值。 但是,如果存在這樣的輔助方法,很可能它會以類似的方式實現,但只有一次為后續方法的調用返回相同的值時才會計算TTL。

因此,您只需通過計算一次TTL就可以簡單地改進代碼,它將變得更加優化。 此外,您可以隨時聯系Ignite社區,建議在公共API中添加類似的方法。

按照dmagda的建議(干杯),我聯系了Ignite社區。 正如Apache Ignite用戶論壇的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,目前無法檢查是否使用withExpiryPolicy()方法創建了一個IgniteCache實例。

他認為可以在IgniteCache上添加getExpiryPolicy(),如果這是默認緩存實例,則返回已配置的到期策略(可能為null),如果使用withExpiryPolicy()創建緩存實例,則返回用戶指定的到期策略。

將此交叉發布到Ignite開發列表,以查看開發社區的想法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM