![](/img/trans.png)
[英]Ignite Scan Query Throws class org.apache.ignite.binary.BinaryInvalidTypeException
[英]Ignite Scan Query Issue
我正在使用 Ignite 將 KV 類型為 String-String 的緩存值存儲在名為“DOCIDS”的緩存中。
我正在使用 HashMap 的二進制轉換的 object 作為另一個名為“URLS”的 KV 緩存中的值。 鍵將僅為字符串,但值將是“com.xyz.scrapy.common.ignite.IgniteObject”。
現在,當我查詢掃描操作時,我正在這樣做
//This scan query should only happen on cache which has K-V types as String-String.
public Object scan(Object... allObjects) throws Exception {
Set<Object> matchedKeys = new HashSet<>();
try (QueryCursor<Cache.Entry<String, String>> cursor =
cacheHolder.getSecondaryCache().query(new ScanQuery<>(
(k, v) -> k.contains(allObjects[0].toString())
))) {
for (Cache.Entry<String, String> entry : cursor) {
matchedKeys.add(entry.getKey());
}
}
return matchedKeys;
}
在 allObjects 中,值將是某個字符串模式的每次。 這是肯定的。 但是當 Ignite 篩選這些值時,某處的值是 IgniteObject 類型,我沒有首先將其插入“DOCIDS”緩存中。 異常附在下面:
"com.xyz.scrapy.common.ignite.ScrapyIgniteException: IGNITE EXCEPTION :: Exception while scanning for keys with given pattern in Ignite db - DOCIDS. Exception - IDSCaused by: javax.cache.CacheException: class org.apache.ignite.IgniteCheckedException: Failed to execute query on node [query=GridCacheQueryBean [qry=GridCacheQueryAdapter [type=SCAN, clsName=null, clause=null, filter=com.xyz.scrapy.common.ignite.IgniteQuery$QueryObject$$Lambda$243/2029270129@58665d95, transform=null, part=null, incMeta=false, pageSize=1024, timeout=0, incBackups=false, forceLocal=false, dedup=false, prj=org.apache.ignite.internal.cluster.ClusterGroupAdapter@1dfc48e7, keepBinary=false, subjId=0ef0942f-d2d1-4ac0-aa5b-783b3e1a0960, taskHash=0, mvccSnapshot=null, dataPageScanEnabled=null], rdc=null, trans=null], nodeId=f01b04de-66c0-4edc-8efe-4977ecf656b1]
at org.apache.ignite.internal.processors.cache.GridCacheUtils.convertToCacheException(GridCacheUtils.java:1272)
at org.apache.ignite.internal.processors.cache.query.GridCacheQueryFutureAdapter.next(GridCacheQueryFutureAdapter.java:167)
at org.apache.ignite.internal.processors.cache.query.GridCacheDistributedQueryManager$5.onHasNext(GridCacheDistributedQueryManager.java:645)
at org.apache.ignite.internal.util.GridCloseableIteratorAdapter.hasNextX(GridCloseableIteratorAdapter.java:52)
at org.apache.ignite.internal.util.lang.GridIteratorAdapter.hasNext(GridIteratorAdapter.java:44)
at org.apache.ignite.internal.processors.cache.AutoClosableCursorIterator.hasNext(AutoClosableCursorIterator.java:47)
at com.xyz.scrapy.common.ignite.IgniteQuery$QueryObject.scan(IgniteQuery.java:103)
at com.xyz.scrapy.common.ignite.IgniteQuery.executeFieldsQuery(IgniteQuery.java:47)
at com.xyz.scrapy.common.ignite.IgniteConnectionHandler$CacheHolder.scanKeys(IgniteConnectionHandler.java:302)
Caused by: class org.apache.ignite.binary.BinaryInvalidTypeException: com.xyz.scrapy.common.ignite.IgniteObject
at org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:643)
at org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize0(BinaryReaderExImpl.java:1755)
at org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize(BinaryReaderExImpl.java:1714)
at org.apache.ignite.internal.processors.cache.CacheObjectUtils.unwrapBinary(CacheObjectUtils.java:177)
at org.apache.ignite.internal.processors.cache.CacheObjectUtils.unwrapBinaryIfNeeded(CacheObjectUtils.java:40)
at org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$ScanQueryIterator.advance(GridCacheQueryManager.java:3050)
at org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$ScanQueryIterator.onHasNext(GridCacheQueryManager.java:2952)
at org.apache.ignite.internal.util.GridCloseableIteratorAdapter.hasNextX(GridCloseableIteratorAdapter.java:52)
at org.apache.ignite.internal.util.lang.GridIteratorAdapter.hasNext(GridIteratorAdapter.java:44)
at org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager.runQuery(GridCacheQueryManager.java:1141)
at org.apache.ignite.internal.processors.cache.query.GridCacheDistributedQueryManager.processQueryRequest(GridCacheDistributedQueryManager.java:232)
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:1142)
at org.apache.ignite.internal.processors.cache.GridCacheIoManager.onMessage0(GridCacheIoManager.java:591)
at org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:392)
at org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:318)
at org.apache.ignite.internal.processors.cache.GridCacheIoManager.access$100(GridCacheIoManager.java:109)
at org.apache.ignite.internal.processors.cache.GridCacheIoManager$1.onMessage(GridCacheIoManager.java:308)
at org.apache.ignite.internal.managers.communication.GridIoManager.invokeListener(GridIoManager.java:1635)
at org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:1255)
at org.apache.ignite.internal.managers.communication.GridIoManager.access$4300(GridIoManager.java:144)
at org.apache.ignite.internal.managers.communication.GridIoManager$8.execute(GridIoManager.java:1144)
Caused by: java.lang.ClassNotFoundException: com.xyz.scrapy.common.ignite.IgniteObject
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
有人可以解釋為什么 Ignite 從緩存 DOCIDS 中獲取 IgniteObject 嗎? 因為我只將 IgniteObject 存儲在“URLS”緩存中而不是“DOCIDS”中。 實際的例外是它沒有加載 class IgniteObject。 我什至不確定為什么它無法加載,因為我可以毫無問題地插入這些對象。
IgniteObject class 如下
import org.apache.ignite.binary.BinaryObject;
import org.apache.ignite.binary.BinaryObjectBuilder;
import java.io.Serializable;
//If value is not String, every value of K-V Store should wrap its contents with this Object
public class IgniteObject implements Serializable {
//Value set via Reflection
private Object object;
public static BinaryObject convertToBinaryObject(Object object) throws Exception{
//IgniteConnectionHandler.getConnection() will get Ignite Object named ignite. getObjectBuilder will do ignite.binary().builder(stringValue)
BinaryObjectBuilder builder = IgniteConnectionHandler.getConnection().getObjectBuilder(IgniteObject.class.getName());
builder.setField("object", object);//No I18N
return builder.build();
}
public Object getActualObject(){
return object;
}
}
注意:cacheHolder.getSecondaryCache() 將給出 object - IgniteCache。
您在Cache.Entry
中同時獲得鍵和值,即使您只使用鍵,這種情況也會急切地發生。
你可以試試
cacheHolder.getSecondaryCache().withKeepBinary().query(...)
以避免需要IgniteObject
class。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.