[ https://issues.apache.org/jira/browse/IGNITE-4647?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Stanilovsky Evgeny updated IGNITE-4647: --------------------------------------- Attachment: repro-2813.tar.gz > ComputeTask with custom classLoader fail > ---------------------------------------- > > Key: IGNITE-4647 > URL: https://issues.apache.org/jira/browse/IGNITE-4647 > Project: Ignite > Issue Type: Bug > Components: compute > Affects Versions: 2.0 > Reporter: Stanilovsky Evgeny > Priority: Minor > Attachments: repro-2813.tar.gz > > > In case, when we want to run ComputeTask with custom classLoader and custom > inherited IgniteCallable class initialized with instance from custom loader, > catch error *java.lang.ClassNotFoundException*. > for example we implementing something like : > {code} > public class MyCallable implements Callable<Integer> { > public Integer call() throws Exception { > System.out.println("I'm called. Working now!"); > } > } > {code} > {code} > public class IgniteCallableWrapper implements IgniteCallable<Integer> { > private final Class<? extends Callable<Integer>> innerCallableClass; > public IgniteCallableWrapper(Class<? extends Callable<Integer>> > innerCallableClass) { > this.innerCallableClass = innerCallableClass; > } > public Integer call() throws Exception { > Callable<Integer> callableInstance = > innerCallableClass.newInstance(); > return callableInstance.call(); > } > } > {code} > and start two nodes like : > first > {code} > public static void main(String[] args) throws MalformedURLException, > ClassNotFoundException { > IgniteConfiguration icfg = new IgniteConfiguration(); > icfg.setGridName("grid"); > icfg.setPeerClassLoadingEnabled(true); > Ignition.start(icfg); > } > {code} > and second : > {code} > private final static File myCallableArtifact = new > File("./my-callable-artifact.jar"); > private final static File igniteCallableArtifact = new > File("./ignite-callable.jar"); > public static void main(String[] args) throws MalformedURLException, > ClassNotFoundException, NoSuchMethodException, IllegalAccessException, > InvocationTargetException, InstantiationException { > URLClassLoader myCallableLoader = new URLClassLoader(new URL[] { > myCallableArtifact.toURI().toURL()}); > URLClassLoader igniteWrapperLoader = new URLClassLoader(new URL[] { > igniteCallableArtifact.toURI().toURL()}, > SecondNode.class.getClassLoader()); > IgniteLoader igniteLoader = new > IgniteLoader(SecondNode.class.getClassLoader(), myCallableLoader, > igniteWrapperLoader); > // Start node > IgniteConfiguration icfg = new IgniteConfiguration(); > icfg.setGridName("grid"); > icfg.setPeerClassLoadingEnabled(true); > icfg.setClassLoader(igniteLoader); > Ignite ignite = Ignition.start(icfg); > CacheConfiguration<Long, Long> cacheConfiguration = new > CacheConfiguration<Long, Long>("cache"); > IgniteCache<Long, Long> cache = > ignite.createCache(cacheConfiguration); > // Load callable > Class<?> myCallable = myCallableLoader.loadClass("MyCallable"); > Class<? extends IgniteCallable> igniteCallableClass = (Class<? > extends IgniteCallable>) > igniteWrapperLoader.loadClass("IgniteCallableWrapper"); > Constructor<? extends IgniteCallable> constructor = > igniteCallableClass.getConstructor(Class.class); > IgniteCallable igniteCallable = constructor.newInstance(myCallable); > // Send it everywhere! > for (int i = 0; i < 1024; i++) { > ignite.compute().affinityCall("cache", i, igniteCallable); > } > } > {code} > all detailed info, how to reproduce in attach. > debug shows that function {code} processResourceRequest(UUID nodeId, > GridDeploymentRequest req) {code} return classLoader {code} ClassLoader ldr = > dep.classLoader(); {code} not that expected (that was setting throught > icfg.setClassLoader(igniteLoader);) but classLoader from {code} > ignite.compute().affinityCall("cache", i, igniteCallable); {code} {code} > igniteCallable {code} object. > All source for reproduce can be found in attach. -- This message was sent by Atlassian JIRA (v6.3.15#6346)