Есть ли способ использовать ScanQuery против интерфейса значений кеша? - PullRequest
0 голосов
/ 10 апреля 2019

Мы запускаем двухузловой кластер Ignite с включенной поддержкой персистентности и загрузки классов.Мы столкнулись с проблемой загрузки одноранговых классов, которая может быть сведена к следующему:

IgniteCache хранит значения классов A, B, C. Все они реализуют один и тот же интерфейс X. Любой ScanQuery для этого кэша, которыйпытается работать на интерфейсе X, как

 val cache: IgniteCache<UUID, X> 
.....
 val query = ScanQuery<UUID, X> { _, entry ->  .... }
 cache.query(query, { it.key }).use { keys ->
            for (key in keys) {
                 ........

, с ошибкой:

Caused by: java.lang.ClassCastException: A cannot be cast to X

    at ….Scheduler$poll$dueQuery$1.apply(Scheduler:61)

    at org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$ScanQueryIterator.advance(GridCacheQueryManager.java:3089)

    at org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$ScanQueryIterator.onHasNext(GridCacheQueryManager.java:2982)

    at org.apache.ignite.internal.util.GridCloseableIteratorAdapter.hasNextX(GridCloseableIteratorAdapter.java:53)

    at org.apache.ignite.internal.util.lang.GridIteratorAdapter.hasNext(GridIteratorAdapter.java:45)

at org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager.runQuery(GridCacheQueryManager.java:1164)

    at org.apache.ignite.internal.processors.cache.query.GridCacheDistributedQueryManager.processQueryRequest(GridCacheDistributedQueryManager.java:230)

    at org.apache.ignite.internal.processors.cache.query.GridCacheDistributedQueryManager$2.apply(GridCacheDistributedQueryManager.java:108)

    at org.apache.ignite.internal.processors.cache.query.GridCacheDistributedQueryManager$2.apply(GridCacheDistributedQueryManager.java:106)

    at org.apache.ignite.internal.processors.cache.GridCacheIoManager.processMessage(GridCacheIoManager.java:1054)

    at org.apache.ignite.internal.processors.cache.GridCacheIoManager.onMessage0(GridCacheIoManager.java:579)

    at org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:378)

    at org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:304)

    at org.apache.ignite.internal.processors.cache.GridCacheIoManager.access$100(GridCacheIoManager.java:99)

    at org.apache.ignite.internal.processors.cache.GridCacheIoManager$1.onMessage(GridCacheIoManager.java:293)

    at org.apache.ignite.internal.managers.communication.GridIoManager.invokeListener(GridIoManager.java:1556)

    at org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:1184)

    at org.apache.ignite.internal.managers.communication.GridIoManager.access$4200(GridIoManager.java:125)

    at org.apache.ignite.internal.managers.communication.GridIoManager$9.run(GridIoManager.java:1091)

    ... 3 common frames omitted

Если мы сохраняем только один определенный класс A в этом кеше и позволяем ScanQuery работать с этимкэша, все работает нормально.

Классы A, B, C упорядочены OptimizedMarshaller из-за пользовательской сериализации с Externalizable.

Поддерживается ли этот сценарий?Мы что-то делаем не так?

...