1

I encounter this exception using Ignite

class org.apache.ignite.IgniteException: Query execution failed: GridCacheQueryBean [qry=GridCacheQueryAdapter [type=SCAN, clsName=null, clause=null, filter=org.apache.ignite.yardstick.cache.IgniteScanQueryBenchmark$1@5cbed480, part=null, incMeta=false, metrics=GridCacheQueryMetricsAdapter [minTime=41, maxTime=41, avgTime=41.0, execs=1, fails=1, executed=true], pageSize=1024, timeout=0, keepAll=true, incBackups=false, dedup=false, prj=null, keepPortable=false, subjId=0ae47ff7-9cc1-4b57-88cf-8453f5f21625, taskHash=0], rdc=null, trans=null]
at org.apache.ignite.internal.processors.cache.query.GridCacheQueryFutureAdapter.next(GridCacheQueryFutureAdapter.java:166)
at org.apache.ignite.internal.processors.cache.IgniteCacheProxy$2.onHasNext(IgniteCacheProxy.java:406)
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.QueryCursorImpl.getAll(QueryCursorImpl.java:71)

And my code

 IgniteBiPredicate<Integer, Person> filter = new IgniteBiPredicate<Integer, Person>() {
        @Override
        public boolean apply(Integer key, Person p) {
            return p.getSalary() >= minSalary && p.getSalary() <= maxSalary;
        }
    };

    QueryCursor<Person> cursor = cache.query(new ScanQuery(filter));

    return cursor.getAll();

whats wrong with my code

version

ver. 1.2.0-incubating#20150616-sha1:9fb960ff 2015 Copyright(C) Apache Software Foundation

4

2 回答 2

3

您的代码看起来正确。但是您是否提供了整个跟踪?它应该有原因,可以提供有关失败原因的更多信息。您还可以检查远程节点日志。

很可能你有某种序列化错误。尝试以下操作:

  • 将您的谓词转换为顶级类。匿名类引用了父对象,因此您可能正在序列化不应该序列化的东西。
  • 确保谓词类在所有节点上都可用。
于 2015-08-26T03:44:01.800 回答
0

我明白Valentin Kulichenko在这个帖子中的回答解决了我的问题,但在阅读了那个答案后我几乎没有问题。我喜欢通过回答我如何处理他们来分享我在这个线程中的经验

1)当我依赖于封闭方法中存在的变量和参数时,如何将我的谓词转换为顶级类?

您可以将这些参数作为类变量引入并进行构造函数初始化
我就是这样做的

   package com.ignite.filters
   public class MatchingClientIdsCondition implements IgniteBiPredicate<String, Object> {

        private String clientId;

        public MatchingClientIdsCondition() {
          super();
        }
        public MatchingClientIdsCondition(String clientId) {
          this.clientId = clientId;
        }

        @Override
        public boolean apply(String key, Object value) {
          return key.matches(clientId + "(.*)");
        }
    }

2)我应该如何在所有节点中部署我的谓词类?

移动到存在谓词类的包的基本目录(在我的情况下,我必须移动到 com 目录)并准备 jar 文件
使用命令jar cvf <jar name> .准备 jar 文件,或者您可以在 eclipse 中使用导出选项。
将此 JAR 复制到所有 ignite 节点中的 libs 文件夹

于 2019-04-04T06:26:06.710 回答