关于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。
我正在使用 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。