Hi Denis,

thank you for your quick response. Unfortunately even avoiding lambdas or 
anonymous classes didn't solve this problem. 
And was my first thought for this problem too.

With: 

MyFilter.java

import org.apache.ignite.lang.IgniteClosure;

public class MyFilter<T> implements IgniteClosure<T, Long> {

  private static final long serialVersionUID = 1L;
  private final long l;

  public MyFilter(long l) {
    this.l = l;
  }

  @Override
  public Long apply(T e) {
    return l;
  }

}


and 

try (Ignite ignite = Ignition.start("ignite.xml")) {
   IgniteCache<Integer, String> cache = 
ignite.getOrCreateCache("ScanTransformTest");
  ...
   // 2 Running the ScanQuery on the remote server. Works!
  compute.broadcast(() -> {
    try (QueryCursor<Long> cursor = cache.query(new 
ScanQuery<>().setLocal(true), new MyFilter<>(234))) {
      for (Long row : cursor) {
        return row;
      }
    }
    return 0;
  })
  
  // 3 Still does not work.
  try (QueryCursor<Long> cursor = cache.query(new ScanQuery<>(), new 
MyFilter<>(345L))) {
    for (Long row : cursor) {
      System.out.println(row);
      break;
    }
  }
}

Still does not work, this time complaining that the MyFilter class is not found.
PeerClassLoading is active as far as I can tell. At least in both server/client 
ignite config
...
<property name="peerClassLoadingEnabled" value="true"/>
...
it is enabled.

I'm also not sure why the same class (IgniteClosure) works in the other case 
but not in the Transformer or whats the differnt in case 2 to 3.
I guess making the MyFilter class available on the server will solve this 
problem, but should not peerClassLoading work here?

Is there any information  I can provide or test I should do to help to solve 
this problem.

Thank you very much.


Stack Trace:
Exception in thread "main" javax.cache.CacheException: class 
org.apache.ignite.IgniteCheckedException: MyFilter
        at 
org.apache.ignite.internal.processors.cache.GridCacheUtils.convertToCacheException(GridCacheUtils.java:1317)
        at 
org.apache.ignite.internal.processors.cache.query.GridCacheQueryFutureAdapter.next(GridCacheQueryFutureAdapter.java:173)
        at 
org.apache.ignite.internal.processors.cache.query.GridCacheDistributedQueryManager$5.onHasNext(GridCacheDistributedQueryManager.java:645)
        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.AutoClosableCursorIterator.hasNext(AutoClosableCursorIterator.java:49)
        at ScanQueryTest.main(ScanQueryTest.java:57)
Caused by: class org.apache.ignite.IgniteCheckedException: MyFilter
        at 
org.apache.ignite.internal.util.IgniteUtils.unmarshal(IgniteUtils.java:10310)
        at 
org.apache.ignite.internal.processors.cache.query.GridCacheQueryRequest.finishUnmarshal(GridCacheQueryRequest.java:389)
        at 
org.apache.ignite.internal.processors.cache.GridCacheIoManager.unmarshall(GridCacheIoManager.java:1625)
        at 
org.apache.ignite.internal.processors.cache.GridCacheIoManager.onMessage0(GridCacheIoManager.java:586)
        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:1843)
        at 
org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:1468)
        at 
org.apache.ignite.internal.managers.communication.GridIoManager.access$5200(GridIoManager.java:229)
        at 
org.apache.ignite.internal.managers.communication.GridIoManager$9.run(GridIoManager.java:1365)
        at 
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at 
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: class org.apache.ignite.binary.BinaryInvalidTypeException: MyFilter
        at 
org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:724)
        at 
org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:721)
        at 
org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize0(BinaryReaderExImpl.java:1757)
        at 
org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize(BinaryReaderExImpl.java:1716)
        at 
org.apache.ignite.internal.binary.GridBinaryMarshaller.deserialize(GridBinaryMarshaller.java:307)
        at 
org.apache.ignite.internal.binary.BinaryMarshaller.unmarshal0(BinaryMarshaller.java:101)
        at 
org.apache.ignite.marshaller.AbstractNodeNameAwareMarshaller.unmarshal(AbstractNodeNameAwareMarshaller.java:81)
        at 
org.apache.ignite.internal.util.IgniteUtils.unmarshal(IgniteUtils.java:10304)
        ... 14 more
Caused by: java.lang.ClassNotFoundException: MyFilter
        at 
java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
        at 
java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
        at java.base/java.lang.Class.forName0(Native Method)
        at java.base/java.lang.Class.forName(Class.java:398)
        at 
org.apache.ignite.internal.util.IgniteUtils.forName(IgniteUtils.java:8828)
        at 
org.apache.ignite.internal.MarshallerContextImpl.getClass(MarshallerContextImpl.java:374)
        at 
org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:715)
        ... 21 more



On 7/1/20 7:09 PM, Denis Magda wrote:
> Hi Rafael,
> 
> Lamdas and anonymous classes capture and serialize their Inner/OuterClass
> with all the fields, and classes of the fields of those fields, etc. In
> your case, ScanQueryClass was captured during the lamda serialization and
> that class was not found during deserialization on the other side:
> 
> Caused by: class org.apache.ignite.binary.BinaryObjectException: Failed to
> read field [name=capturingClass]
>         at
> org.apache.ignite.internal.binary.BinaryFieldAccessor.read(BinaryFieldAccessor.java:192)
>         at
> org.apache.ignite.internal.binary.BinaryClassDescriptor.read(BinaryClassDescriptor.java:874)
>         ... 20 more
> Caused by: class org.apache.ignite.binary.BinaryInvalidTypeException:
> ScanQueryTest
>         at
> org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:724)
>         at
> org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:721)
>         at
> org.apache.ignite.internal.binary.BinaryUtils.doReadClass(BinaryUtils.java:1638)
>         at
> org.apache.ignite.internal.binary.BinaryUtils.doReadClass(BinaryUtils.java:1575)
>         at
> org.apache.ignite.internal.binary.BinaryUtils.doReadClass(BinaryUtils.java:1552)
>         at
> org.apache.ignite.internal.binary.BinaryReaderExImpl.readClass(BinaryReaderExImpl.java:383)
>         at
> org.apache.ignite.internal.binary.BinaryFieldAccessor$DefaultFinalClassAccessor.readFixedType(BinaryFieldAccessor.java:907)
>         at
> org.apache.ignite.internal.binary.BinaryFieldAccessor$DefaultFinalClassAccessor.read0(BinaryFieldAccessor.java:703)
>         at
> org.apache.ignite.internal.binary.BinaryFieldAccessor.read(BinaryFieldAccessor.java:188)
>         ... 21 more
> *Caused by: java.lang.ClassNotFoundException: ScanQueryTest*
>         at
> java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
>         at
> java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
>         at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
>         at java.base/java.lang.Class.forName0(Native Method)
>         at java.base/java.lang.Class.forName(Class.java:398)
>         at
> org.apache.ignite.internal.util.IgniteUtils.forName(IgniteUtils.java:8828)
>         at
> org.apache.ignite.internal.MarshallerContextImpl.getClass(MarshallerContextImpl.java:374)
>         at
> org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:715)
>         ... 29 more
> 
> My advice is to avoid using lambdas and anonymous classes due to this
> specificity. Instead, you can create "private static classes" and Ignite
> will be serializing an instance of that class only:
> 
> private static class MyFilter implements IgniteClosure {
> ....
> }
> 
> Lamdas are nice for demos and simple code samples where Inner/OuterClasses
> are simple Java classes. While in real production environments, things can
> get messy.
> 
> -
> Denis
> 
> 
> On Wed, Jul 1, 2020 at 9:36 AM Rafael Troilo <rafael.tro...@heigit.org>
> wrote:
> 
>> Hey Guys,
>>
>> I have a strange problem with the Transform part of a ScanQuery that I get
>> a deserialize object exception for the SerializedLambda.
>>> javax.cache.CacheException: class
>> org.apache.ignite.IgniteCheckedException: Failed to deserialize object
>> [typeName=java.lang.invoke.SerializedLambda]
>>
>> Strange is that it works very well in other cases like:
>>
>> try (Ignite ignite = Ignition.start("ignite.xml")) {
>>   IgniteCache<Integer,String> cache =
>> ignite.createCache("ScanTransformTest");
>>   cache.put(1, "Hello");
>>
>>   // 1  Just a broadcast with a IgniteClosure works!
>>   compute.broadcast((a) -> 123L, "Hello").forEach(System.out::println);
>>
>>   // 2 Running the ScanQuery on the remote server. Works too!
>>   compute.broadcast(() -> {
>>     try(QueryCursor<Long> cursor = cache.query(new
>> ScanQuery<>().setLocal(true), (a) -> 234L)){
>>       for( Long row : cursor) {
>>         return row;
>>       }
>>     }
>>     return 0;
>>   }).forEach(System.out::println);
>>
>>
>>   // 3 But running it from the client side it fails!
>>   try(QueryCursor<Long> cursor = cache.query(new ScanQuery<>(), (a) ->
>> 345L)){
>>     for( Long row : cursor) {
>>       System.out.println(row);
>>       break;
>>     }
>>   }
>>
>> }
>>
>> Also changing the Lambda to a actually class implementing IgniteClosure
>> results in the same problem.
>>
>> Any idea what I'm doing wrong?
>>
>> We are running ignite ver. 2.8.0#20200226-sha1:341b01df
>> With java openjdk 11.0.7 2020-04-14
>>
>> Thank you!
>>
>> Best,
>> Rafael
>>
>>
>> Error Log:
>> Exception in thread "main" javax.cache.CacheException: class
>> org.apache.ignite.IgniteCheckedException: Failed to deserialize object
>> [typeName=java.lang.invoke.SerializedLambda]
>>         at
>> org.apache.ignite.internal.processors.cache.GridCacheUtils.convertToCacheException(GridCacheUtils.java:1317)
>>         at
>> org.apache.ignite.internal.processors.cache.query.GridCacheQueryFutureAdapter.next(GridCacheQueryFutureAdapter.java:173)
>>         at
>> org.apache.ignite.internal.processors.cache.query.GridCacheDistributedQueryManager$5.onHasNext(GridCacheDistributedQueryManager.java:645)
>>         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.AutoClosableCursorIterator.hasNext(AutoClosableCursorIterator.java:49)
>>         at ScanQueryTest.main(ScanQueryTest.java:49)
>> Caused by: class org.apache.ignite.IgniteCheckedException: Failed to
>> deserialize object [typeName=java.lang.invoke.SerializedLambda]
>>         at
>> org.apache.ignite.internal.util.IgniteUtils.unmarshal(IgniteUtils.java:10310)
>>         at
>> org.apache.ignite.internal.processors.cache.query.GridCacheQueryRequest.finishUnmarshal(GridCacheQueryRequest.java:389)
>>         at
>> org.apache.ignite.internal.processors.cache.GridCacheIoManager.unmarshall(GridCacheIoManager.java:1625)
>>         at
>> org.apache.ignite.internal.processors.cache.GridCacheIoManager.onMessage0(GridCacheIoManager.java:586)
>>         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:1843)
>>         at
>> org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:1468)
>>         at
>> org.apache.ignite.internal.managers.communication.GridIoManager.access$5200(GridIoManager.java:229)
>>         at
>> org.apache.ignite.internal.managers.communication.GridIoManager$9.run(GridIoManager.java:1365)
>>         at
>> java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
>>         at
>> java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
>>         at java.base/java.lang.Thread.run(Thread.java:834)
>> Caused by: class org.apache.ignite.binary.BinaryObjectException: Failed to
>> deserialize object [typeName=java.lang.invoke.SerializedLambda]
>>         at
>> org.apache.ignite.internal.binary.BinaryClassDescriptor.read(BinaryClassDescriptor.java:913)
>>         at
>> org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize0(BinaryReaderExImpl.java:1764)
>>         at
>> org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize(BinaryReaderExImpl.java:1716)
>>         at
>> org.apache.ignite.internal.binary.GridBinaryMarshaller.deserialize(GridBinaryMarshaller.java:307)
>>         at
>> org.apache.ignite.internal.binary.BinaryMarshaller.unmarshal0(BinaryMarshaller.java:101)
>>         at
>> org.apache.ignite.marshaller.AbstractNodeNameAwareMarshaller.unmarshal(AbstractNodeNameAwareMarshaller.java:81)
>>         at
>> org.apache.ignite.internal.util.IgniteUtils.unmarshal(IgniteUtils.java:10304)
>>         ... 14 more
>> Caused by: class org.apache.ignite.binary.BinaryObjectException: Failed to
>> read field [name=capturingClass]
>>         at
>> org.apache.ignite.internal.binary.BinaryFieldAccessor.read(BinaryFieldAccessor.java:192)
>>         at
>> org.apache.ignite.internal.binary.BinaryClassDescriptor.read(BinaryClassDescriptor.java:874)
>>         ... 20 more
>> Caused by: class org.apache.ignite.binary.BinaryInvalidTypeException:
>> ScanQueryTest
>>         at
>> org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:724)
>>         at
>> org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:721)
>>         at
>> org.apache.ignite.internal.binary.BinaryUtils.doReadClass(BinaryUtils.java:1638)
>>         at
>> org.apache.ignite.internal.binary.BinaryUtils.doReadClass(BinaryUtils.java:1575)
>>         at
>> org.apache.ignite.internal.binary.BinaryUtils.doReadClass(BinaryUtils.java:1552)
>>         at
>> org.apache.ignite.internal.binary.BinaryReaderExImpl.readClass(BinaryReaderExImpl.java:383)
>>         at
>> org.apache.ignite.internal.binary.BinaryFieldAccessor$DefaultFinalClassAccessor.readFixedType(BinaryFieldAccessor.java:907)
>>         at
>> org.apache.ignite.internal.binary.BinaryFieldAccessor$DefaultFinalClassAccessor.read0(BinaryFieldAccessor.java:703)
>>         at
>> org.apache.ignite.internal.binary.BinaryFieldAccessor.read(BinaryFieldAccessor.java:188)
>>         ... 21 more
>> Caused by: java.lang.ClassNotFoundException: ScanQueryTest
>>         at
>> java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
>>         at
>> java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
>>         at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
>>         at java.base/java.lang.Class.forName0(Native Method)
>>         at java.base/java.lang.Class.forName(Class.java:398)
>>         at
>> org.apache.ignite.internal.util.IgniteUtils.forName(IgniteUtils.java:8828)
>>         at
>> org.apache.ignite.internal.MarshallerContextImpl.getClass(MarshallerContextImpl.java:374)
>>         at
>> org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:715)
>>         ... 29 more
>>
>>
>>
>>
>>
>> --
>> Rafael Troilo
>> HeiGIT gGmbH
>> Heidelberg Institute for Geoinformation Technology at Heidelberg University
>>
>> https://heigit.org | rafael.tro...@heigit.org | phone +49-6221-533 484
>>
>> Postal address: Schloss-Wolfsbrunnenweg 33 | 69118 Heidelberg | Germany
>> Offices: Berliner Str. 45 | 69120 Heidelberg | Germany
>>
>> Amtsgericht Mannheim | HRB 733765
>> Managing Directors: Prof. Dr. Alexander Zipf | Dr. Gesa Schönberger
>>
> 

-- 
Rafael Troilo
HeiGIT gGmbH
Heidelberg Institute for Geoinformation Technology at Heidelberg University

https://heigit.org | rafael.tro...@heigit.org | phone +49-6221-533 484

Postal address: Schloss-Wolfsbrunnenweg 33 | 69118 Heidelberg | Germany
Offices: Berliner Str. 45 | 69120 Heidelberg | Germany

Amtsgericht Mannheim | HRB 733765
Managing Directors: Prof. Dr. Alexander Zipf | Dr. Gesa Schönberger

Reply via email to