Apache Ignite缓存事件侦听器和EJB中的依赖注入问题

时间:2015-07-30 16:17:56

标签: java dependency-injection ignite

我有一个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对象本身,很容易快速获取缓存的句柄。希望这不是问题。

这部署很好。但是当我在缓存上放置一些东西时,我在&#34; listenerDelegate.respondToCacheEvent&#34;上得到了一个N​​ullPointerException。 &#34;申请&#34;方法。这显然意味着当Ignite对听众进行注册时,CDI注入到那时还没有发生。或者问题可能完全不同。

我正在做的是正确的吗?我怎样才能确保所有注入都正确发生,然后注册remoteListener?

2 个答案:

答案 0 :(得分:2)

好吧,事实证明我需要默认的构造函数用于我希望在其他类中注入其对象的类:(

我不知道。为我的EventListenerDelegate类添加空的无参数构造函数后,一切都很好!

抱歉浪费你的时间:(

答案 1 :(得分:0)

remoteListener被序列化并在注册Ignite事件侦听器时发送到远程节点。因此,在调用listenerDelegate方法之前必须注入registerRemoteEventListener,但此时它看起来像null

你能检查一下这种情况吗?

相关问题