Hi Ilya, hey Denis,
thank you both of you for taking a look into this problem.
How would you like get the reproducing stand-alone runnable?
I attached a single file which reproduces the problem.
Do you like to have it in any other way?
Some comments:
In this issue, it does not matter if the Transformer Class is a static member
class or a separate class it self. Both produce the exception.
The Transformer (IgniteClosure) class works fine in a broadcast.
// simple IgniteClosure broadcast
ignite.compute().broadcast(new Transformer<>(),
"broadcast").forEach(System.out::println);
and for a scanquery with transform from within remote job (like this broadcast)
// broadcast which return the result the scanquery transform
ignite.compute().broadcast(() -> {
return cache.query(new ScanQuery<>(), new Transformer<>()).getAll();
}).stream().flatMap(List::stream).forEach(System.out::println);
but does not work on the client side directly
// does throw a ClassNotFound Exception about the Transformer Class.
cache.query(new ScanQuery<>(), new
Transformer<>()).getAll().forEach(System.out::println);
Thank you.
Let me know if I can do more to help you to find the problem.
Best,
Rafael
On 7/2/20 5:39 PM, Ilya Kasnacheev wrote:
> Hello!
>
> I would like to start with a reproducer. Rafael, can you please throw
> together a runnable stand-alone reproducer of this issue?
>
> Thanks,
>
--
Rafael Troilo
HeiGIT gGmbH
Heidelberg Institute for Geoinformation Technology at Heidelberg University
https://heigit.org | [email protected] | 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
import java.util.Collections;
import java.util.List;
import javax.cache.Cache.Entry;
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.Ignition;
import org.apache.ignite.cache.query.QueryCursor;
import org.apache.ignite.cache.query.ScanQuery;
import org.apache.ignite.lang.IgniteClosure;
public class ScanQueryWithTransform {
private static final String cacheName = "ScanQueryTransformerIssue";
public static void main(String[] args) {
if(args.length == 0) {
System.out.println("missing config file argument!");
System.exit(1);
}
String cfg = args[0];
Ignition.setClientMode(true);
try(Ignite ignite = Ignition.start(cfg)){
IgniteCache<Integer, String> cache = ignite.createCache(cacheName);
for(int i=0; i < 5; i++) {
// fill cache with some data
cache.put(i,Integer.toBinaryString(i));
}
// simple IgniteClosure broadcast
ignite.compute().broadcast(new Transformer<>(), "broadcast").forEach(System.out::println);
// broadcast which return the result the scanquery transform
ignite.compute().broadcast(() -> {
return cache.query(new ScanQuery<>(), new Transformer<>()).getAll();
}).stream().flatMap(List::stream).forEach(System.out::println);
cache.query(new ScanQuery<>(), new Transformer<>()).getAll().forEach(System.out::println);
// System.out.println("Scan Query!");
// ScanQuery<Integer,String> qry = new ScanQuery<>();
// try(QueryCursor<Entry<Integer, String>> cursor = cache.query(new ScanQuery<>(), new Transformer<>())){
// // throws exception about ClassNotFound Transformer
// cursor.getAll();
// }catch(Exception e) {
// e.printStackTrace();
// }
//clean up!
ignite.destroyCache(cacheName);
}
}
private static class Transformer<T> implements IgniteClosure<T,T> {
private static final long serialVersionUID = 1L;
@Override
public T apply(T e) {
return e;
}
}
}