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

2

好吧,事实证明我需要将其对象注入其他类的类的默认构造函数:(

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

很抱歉浪费您的时间:(

于 2015-07-31T01:47:25.013 回答
0

remoteListener当注册 Ignite 事件监听器时被序列化并发送到远程节点。所以listenerDelegate必须在registerRemoteEventListener调用方法之前注入,但看起来就null在那个时候。

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

于 2015-07-30T20:16:25.150 回答