[
https://issues.apache.org/jira/browse/IGNITE-4647?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Stanilovsky Evgeny updated IGNITE-4647:
---------------------------------------
Description:
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.
was:
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*.
-- deploy node code --
IgniteConfiguration icfg = new IgniteConfiguration();
icfg.setGridName("grid");
icfg.setPeerClassLoadingEnabled(true);
icfg.setClassLoader(igniteLoader);
--client code --
IgniteConfiguration icfg = new IgniteConfiguration();
icfg.setGridName("grid");
icfg.setPeerClassLoadingEnabled(true);
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.
> 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)