2016-04-22 10 views
0

Apache Igniteのドキュメントを読んだことから、Eclipseで使用していたクラス(自動的に(魔法のように))がIgniteサーバーの分散インスタンスに自動的に送信されるという印象を受けました。Apache Ignite:Classloader

私は3つのバニラサーバを持っていますが、実行中のカスタムクラスはロードされていません(./bin/ignite.sh)。すべてがローカルホスト上にあります。彼らは非常にきれいに仲間です。

私は、キャッシュにロードするために使用する1つのカスタムクラスを使用してEclipseプログラムを実行します。シンプルなPOJO、シリアライザブルなど

コンピューティングコードを実行しようとすると、リモートサーバはクラスローダにないことを文句を言います。

Caused by: java.lang.ClassNotFoundException: com.company.dms.ignite.batch.model.MessageCustAccount 
at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Class.java:348) 
at org.apache.ignite.internal.util.IgniteUtils.forName(IgniteUtils.java:8213) 
at org.apache.ignite.internal.MarshallerContextAdapter.getClass(MarshallerContextAdapter.java:185) 
at org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:607) 
... 29 more 

さらに魔法にはありますか?

 ExecutorService exec = ignite.executorService(ignite.cluster().forRemotes()); 

     // Iterate through all words in the sentence and create jobs. 
     quickCounter = 10; 
     while(it.hasNext() && quickCounter-- > 0){// "Print words using runnable".split(" ")) { 
      final String word = it.next(); 
      // Execute runnable on some node. 
      String interna_cache_name = DMSIgniteHelpers.getInstance().getCurrentCacheLocation(ignite, MSG_CUST_ACCT_CACHE); 

      exec.submit(new IgniteRunnable() { 
      @Override public void run() { 
        String delimeter = "\u0001"; 
        String[] lineTokens = word.split("\\"+delimeter); 

        String three_pk = null; 
        if(lineTokens[2].toString() != null && lineTokens[4].toString() != null && lineTokens[3] != null) { 
          String sor_id = new Integer(lineTokens[2]).toString(); 
          String cust_id = new Long(lineTokens[4]).toString(); 
          String acct_id = lineTokens[3]; 
          three_pk = sor_id + cust_id + acct_id; 
          System.out.println("Looking for ("+sor_id+") ("+cust_id+") ("+acct_id+") : " + three_pk + " ----- "); 
          System.out.println("Going to query cache: " + interna_cache_name); 
          IgniteCache<Integer, MessageCustAccount> msgCustAccountCache = ignite.cache(interna_cache_name); 

          MessageCustAccount a = sqlQuery(msgCustAccountCache,three_pk); 
          System.out.println("*************=================\n\n" + a.toString() + "\[email protected]#[email protected]#[email protected]#[email protected]#[email protected]#[email protected]#[email protected]#[email protected]#[email protected]#[email protected]#[email protected]#$"); 

        } 
       System.out.println(">>> Printing '" + word + "' on this node from grid job."); 
      } 
      }); 
     } 
+0

期待、私は私の元からJARファイルを作成したとして、フォローアップ。それをIgnite/gridgainのlibsフォルダに入れて、コードを書き換えてください。すべては完璧に働いていました....驚くことではありません...しかし、私は実際にその展開ステップなしでこれを達成できると期待していました – chrisfauerbach

答えて

1

モデルクラスが展開され、ピアではありませんが、あなたはキャッシュとクエリBinaryObjectの上withKeepBinary()フラグを使用することができます。この方法でサーバー側の逆シリアル化を回避し、ClassNotFoundExceptionを取得しません。

はこれを行う方法で、この例を参照してください:https://github.com/apache/ignite/blob/master/examples/src/main/java/org/apache/ignite/examples/binary/datagrid/CacheClientBinaryQueryExample.java