Apache Ignite не может получить доступ к кешу из прослушивателя после возникновения события «EVT_CACHE_STARTED» - PullRequest
0 голосов
/ 09 ноября 2018

Я хочу иметь возможность отслеживать события создания кэша в 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 голосов
/ 12 ноября 2018

Как правило, вы не должны выполнять операции с кэшем или большинство других операций, которые блокируют или обращаются к внутренним компонентам Ignite. События должны быть очень быстрыми и легкими, это означает, что они выполняются из потоков Ignite и внутренних блокировок Ignite.

Просто запланируйте операцию в другой ветке по прибытии события.

...