事件“ EVT_CACHE_STARTED”触发后,Apache Ignite无法从侦听器访问缓存

时间:2018-11-09 20:45:15

标签: apache ignite

我希望能够监视Apache Ignite中的缓存创建事件。

每当此类事件发生时-我希望能够在这些缓存创建之后但在其他任何人都不能插入之前对它们进行处理。

所以我用了本地监听器。下面是所有代码:

import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.Ignition;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.events.CacheEvent;
import org.apache.ignite.events.EventType;
import org.apache.ignite.lang.IgnitePredicate;
import org.apache.ignite.resources.IgniteInstanceResource;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;

@Configuration
public class ServerConfig {

    public ServerConfig(Environment e) throws Exception {
        IgniteConfiguration cfg = new IgniteConfiguration();
        cfg.setIncludeEventTypes(EventType.EVT_CACHE_STARTED);
        Ignite ignite = Ignition.start(cfg);
        String cacheName = "test";

        registerCacheCreationListener(ignite);
        IgniteCache<Integer, String> cache = ignite.getOrCreateCache(cacheName);
    }

    private void registerCacheCreationListener(Ignite ignite){
        IgnitePredicate<CacheEvent> locLsnr = new IgnitePredicate<CacheEvent>(){
            @IgniteInstanceResource
            private Ignite ignite;
            @Override
            public boolean apply(CacheEvent evt) {
                System.out.println("Received event [evt=" + evt.name() + " cacheName=" + evt.cacheName());
                IgniteCache<Integer, String > cache = ignite.cache(evt.cacheName());      // CANNOT ACCESS evt.cacheName() - STUCKS HERE
                System.out.println("finish listener");
                return true;
            }
        };
        ignite.events().localListen(locLsnr, EventType.EVT_CACHE_STARTED);
    }
}

所以当我这样做时:

ignite.cache(evt.cacheName())

在IgnitePredicate内部-据我所知它尚不可用。

请帮助我找出哪里出了问题。 谢谢。

1 个答案:

答案 0 :(得分:0)

通常,您不应执行缓存操作,也不应执行大多数其他阻止或访问Ignite内部构件的操作。事件应该非常快速,轻便,这意味着它们是在Ignite线程和Ignite内部锁中执行的。

只需在事件到达时在另一个线程中安排操作即可。