我希望能够监视 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/