0

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

4

2 に答える 2