我有一个 Startup+Singleton EJB,我需要在其中注入一个对象。在这个 EJB 的 PostConstruct 方法中,我需要为 Ignite 网格注册一个远程缓存事件侦听器。此侦听器的“应用”方法应调用注入对象的方法。
@Startup
@Singleton
public class RegisterEventListeners {
@Inject
private EventListenerDelegate listenerDelegate;
@PostConstruct
public void registerListeners() {
Ignition.setClientMode(true);
Ignite ignite = Ignition.start("ignite-config.xml");
registerRemoteEventListener(ignite);
}
public void registerRemoteEventListener(final Ignite ignite) {
IgnitePredicate<CacheEvent> remoteListener = new IgnitePredicate<CacheEvent>() {
public boolean apply(CacheEvent e) {
listenerDelegate.respondToCacheEvent(ignite, e);
return ignite.affinity("IgniteCache").isPrimary(ignite.culster().localNode(), e.key());
}
};
ignite.events(ignite.cluster().forCacheNodes("IgniteCache")).remoteListen(null, remoteListener, EventType.EVT_CACHE_OBJECT_PUT);
}
}
在 EventListenerDelegate 类中,我进一步注入了其他东西,最终将对检索到的缓存事件做一些事情。我将 Ignite 对象也传递给此类的 respondToCacheEvent 方法的原因是因为我在此方法中发出了 cache.remove。因此,如果我传递 Ignite 对象本身,很容易快速获取缓存句柄。希望这不是问题。
这部署得很好。但是当我在缓存上放一些东西时,我在“apply”方法的“listenerDelegate.respondToCacheEvent”行上得到一个 NullPointerException。这显然意味着,当 Ignite 注册监听器时,CDI 注入到那时还没有发生。或者可能问题完全是另外一回事。
我在做什么正确吗?我还能如何确保所有注入都正确发生,然后注册 remoteListener?