java - 事件 "EVT_CACHE_STARTED"触发后,Apache Ignite 无法从监听器访问缓存

标签 java 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 内部 - 据我了解,它尚不可用。

请帮我看看我哪里错了。 谢谢。

最佳答案

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

只需在事件到达时在不同的线程中安排操作即可。

关于java - 事件 "EVT_CACHE_STARTED"触发后,Apache Ignite 无法从监听器访问缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53233030/

相关文章:

java - 将 If Else 条件添加到数组

java - 从 TestSuite 类向 JUnit 测试传递参数

kubernetes - 如何在Apache Ignite .Net中使用TcpDiscoveryKubernetesIpFinder

ignite - 像 count、max、min 这样的简单聚合非常慢

java - Apache Ignite 查询/索引

performance - 如何提高 apache ignite 中的查询性能

java - 通过 JDBC 连接到 Derby 数据库失败

java - Java中的RSA加密

java - 即使启用全部级联后,也无法从具有子记录的父表中删除记录

java - 何时在启用后写的情况下在 Ignite 缓存存储中更新对象?