Apache Ignite не может сериализовать лямбду с удаленного узла - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть эта проводная ошибка, когда я использую сканирование запросов кеша с клиентского узла

        List<Account> data = accounts.query(new ScanQuery<UUID, Account>()).getAll().stream().map(uuidAccountEntry -> uuidAccountEntry.getValue()).collect(Collectors.toList());

, но если я пытаюсь вернуть только объекты (не запись) с фильтром, я получаю исключение

        List<Account> data = accounts.query(new ScanQuery<UUID, Account>(), Cache.Entry::getValue).getAll();

ПРИМЕЧАНИЕ * работает в докере

ignite_1 |09: 54: 05.663 [query- # 58] ОШИБКА oaiibBinaryContext - Не удалось десериализовать объект [typeName = java.lang.invoke.SerializedLambda] ignite_1 |org.apache.ignite.binary.BinaryObjectException: не удалось прочитать поле [name = capturingClass] ignite_1 |в org.apache.ignite.internal.binary.BinaryFieldAccessor.read (BinaryFieldAccessor.java:192) ignite_1 |в org.apache.ignite.internal.binary.BinaryClassDescriptor.read (BinaryClassDescriptor.java:875) ignite_1 |в org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize0 (BinaryReaderExImpl.java:1764) ignite_1 |в org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize (BinaryReaderExImpl.java:1716) ignite_1 |в org.apache.ignite.internal.binary.GridBinaryMarshaller.deserialize (GridBinaryMarshaller.java:313) ignite_1 |в org.apache.ignite.internal.binary.BinaryMarshaller.unmarshal0 (BinaryMarshaller.java:102) ignite_1 |в org.apache.ignite.marshaller.AbstractNodeNameAwareMarshaller.unmarshal (AbstractNodeNameAwareMarshaller.java:82) ignite_1 |в org.apache.ignite.internal.util.IgniteUtils.unmarshal (IgniteUtils.java:10140) ignite_1 |в org.apache.ignite.internal.processors.cache.query.GridCacheQueryRequest.finishUnmarshal (GridCacheQueryRequest.java:344) ignite_1 |в org.apache.ignite.internal.processors.cache.GridCacheIoManager.unmarshall (GridCacheIoManager.java:1530) ignite_1 |в org.apache.ignite.internal.processors.cache.GridCacheIoManager.onMessage0 (GridCacheIoManager.java:576) ignite_1 |в org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage (GridCacheIoManager.java:380) ignite_1 |в org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage (GridCacheIoManager.java:306) ignite_1 |в org.apache.ignite.internal.processors.cache.GridCacheIoManager.access $ 100 (GridCacheIoManager.java:101) ignite_1 |в org.apache.ignite.internal.processors.cache.GridCacheIoManager $ 1.onMessage (GridCacheIoManager.java:295) ignite_1 |в org.apache.ignite.internal.managers.communication.GridIoManager.invokeListener (GridIoManager.java:1569) ignite_1 |в org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0 (GridIoManager.java:1197) ignite_1 |в org.apache.ignite.internal.managers.communication.GridIoManager.access $ 4200 (GridIoManager.java:127) ignite_1 |в org.apache.ignite.internal.managers.communication.GridIoManager $ 9.run (GridIoManager.java:1093) ignite_1 |в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1149) ignite_1 |в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:624) ignite_1 |at java.lang.Thread.run (Thread.java:748)

Все остальные запросы и операции put / get / ... работают идеально и не возникает проблем с сериализацией объекта Account.

Я перепробовал множество конфигураций кеша, но, похоже, ни одна из них не имела значения.

У кого-нибудь была эта проблема или знаете, как ее решить?Заранее спасибо.

1 Ответ

0 голосов
/ 31 декабря 2018

Благодаря комментариям @ Станислава Лукьянова я изменил свой код и добавил новый класс, который реализует IgniteClosure и доступен на всех узлах, как часть моей общей библиотеки jar.

import javax.cache.Cache;
import java.util.UUID;

public class AccountValueClosure implements IgniteClosure<Cache.Entry<UUID, Account>, Account> {
    @Override
    public Account apply(Cache.Entry<UUID, Account> e) {
        return e.getValue();
    }
}

Теперь я могу позвонитьзапрос кеша, как и ожидалось, с экземпляром закрытия ...

        List<Account> data = accounts.query(new ScanQuery<UUID, Account>(), new AccountValueClosure()).getAll();

это ужасно, но работает.

приветствуется любая обратная связь.

...