关于apache ignite IgnitePredicate<EventAdapter>接口

About apache ignite IgnitePredicate<EventAdapter> interface

我正在使用 IgnitePredicate 接口来了解缓存何时被修改(放置或删除)。

@Override
    public boolean apply(EventAdapter e) {
        if (e instanceof CacheEvent) {
            CacheEvent cacheEvent = (CacheEvent)e;
            if (e.type() == EventType.EVT_CACHE_OBJECT_PUT) {
                MyClass obj = (MyClass)cacheEvent.newValue();//line 1
                MyClass obj = ((BinaryObject)cacheEvent.newValue()).deserialize()//line 2
            }
        }
        return true;
    }

我想通过上面的代码把新数据放到缓存中

起初,我使用的是第 1 行代码,它有效。

之后,我发现它导致错误“java.lang.ClassCastException: org.apache.ignite.internal.binary.BinaryObjectImpl cannot be cast to MyClass”。所以我将代码更改为行 2.But 它导致另一个异常“MyClass不能转换为 o.a.i.i.b.BinaryObjectImpl”。而 newValue 是一个 MyClass 对象。

我想知道为什么有时它是 BinaryOjbectImpl 而有时它是 MyClass 对象。或者它取决于我不知道的事情。或者我的代码有问题。

谢谢。 最好的问候。

一般情况下,事件不仅会针对一个确切的缓存触发,还会针对多个缓存触发。 CacheEvent 包含 cacheName 作为 属性。据我所知,您没有根据 cacheName 过滤它们。所以有可能某些缓存正在使用启用二进制存储。您可以获得更多信息here

例如缓存 A 创建为:

IgniteCache<Integer, BinaryObject> binaryCache = ignite.cache("A").withKeepBinary();

另一个(缓存B)创建为:

IgniteCache<Integer, SomeClass> cache = ignite.cache("B");

顺便说一下,我认为实现所需行为的正确方法是使用连续 queries