1

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)

そして私のコード

 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();

私のコードの何が問題なのですか

バージョン

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

4

2 に答える 2

3

あなたのコードは正しいようです。しかし、トレース全体を提供しましたか? 失敗の理由についてより多くの情報を提供する原因が必要です。リモート ノードのログも確認できます。

ほとんどの場合、何らかのシリアル化エラーが発生した可能性があります。次のことを試してください。

  • 述語を最上位クラスに変換します。匿名クラスには親オブジェクトへの参照があるため、シリアル化してはならないものをシリアル化している可能性があります。
  • 述語クラスがすべてのノードで使用可能であることを確認してください。
于 2015-08-26T03:44:01.800 に答える
0

このスレッドでのバレンティン・クリチェンコの答えが私の問題を解決することを理解しましたが、その答えを読んだ後、いくつか質問がありました。私がどのように彼らに対処したかを答えることで、このスレッドで私の経験を共有したいと思います

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 に答える