Hello! Did you enable peer class loading? You need to either enable peer class loading, or put your filter class(es) to all server nodes.
Regards, -- Ilya Kasnacheev чт, 2 июл. 2020 г. в 15:09, Rafael Troilo <rafael.tro...@heigit.org>: > 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 >