Не могу использовать метод Ignite loadCache с IgniteBiPredicate - PullRequest
0 голосов
/ 15 апреля 2019

Я использую 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 голосов
/ 16 апреля 2019

В основном вы получаете BinaryObject вместо ваших объектов POJO.

Вы можете просто выбрать для работы с BinaryObject , или должна быть настройка, чтобы изменить это поведение. Попробуйте cacheCfg.setStoreKeepBinary (false), например, при создании кэша.

UPD: Я проверил это, и кажется, что storeKeepBinary не используется. Во всяком случае, вы можете сделать Foo foo = binaryObject.deserialize();, если хотите. Я все еще не уверен, что это настраивается или это закрытие просто получает то, что ему брошено.

...