オブジェクトを注入する必要がある 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 が登録されていることを確認するには、他にどのようにすればよいでしょうか?