无法将Ignite loadCache方法与IgniteBiPredicate一起使用

时间:2019-04-15 18:37:57

标签: postgresql ignite

我将Apache Ignite用作由postgres数据库支持的缓存,该数据库太大而无法一次初始化所有缓存。相反,我想根据需要将选择性的片段加载到我的缓存中。我想通过loadCache进行此操作(因为readThroughEnabled模式仅适用于简单的缓存操作,但我不能保证会使用它),该方法接受IgniteBiPredicate作为参数。但是,每当我尝试将IgniteBiPredicate用作过滤器时,都会收到ClassCastExceptions阻止我加载缓存。

这是针对服务器本地的Ignite的单个节点。我尝试使用缓存并对其调用“ loadCache(biPredicate,null)”以尝试加载所需的特定数据。这是我的代码示例,其中删除了一些域详细信息:

public void initFoo(int key){
  IgniteCache<Integer, Foo> myCache = getCache(Foo.class);
  if (myCache != null){
    myCache.loadCache(new IgniteBiPredicate<Integer, Foo>() {
      @Override
      public boolean apply(Integer integer, Foo foo){
        return integer == key;
      }
    }, null);
  }
}

我希望这会导致我的缓存被加载,至少是我对此特定条目所关心的部分。相反,我看到了

"Failed to load cache:  Foo"
...(lots of nested exceptions eventually leading to)
...
"Caused by:  jvaa.lang.ClassCastException: 
org.apache.ignite.internal.binary.BinaryObjectImpl cannot be cast to 
com.sms.Foo"

我确信这在我的缓存配置中(至少在Java对象的级别上)不是问题,因为当我执行不带参数的简单loadCache时,整个缓存都可以正常使用。我在做错什么吗?

1 个答案:

答案 0 :(得分:0)

基本上,您得到的是BinaryObject,而不是POJO对象。

您可以只选择work with BinaryObject,否则应该有一个设置可以扭转这种现象。例如,在创建缓存时,尝试使用cacheCfg.setStoreKeepBinary(false)。

UPD::我已经检查了它,似乎没有使用storeKeepBinary。无论如何,如果愿意,您可以进行Foo foo = binaryObject.deserialize();。我仍然不确定这是否是可配置的,或者该闭包是否得到了抛出的结果。