Hi.
I have found another work around. 
I change thread context classloader to parent classloader before proxy
method invoke and swich it back after. 

So the code look like this:

public class ServiceHelper {
    public static <T> T serviceMethodInvoke(Object service, final String
methodName, final Object... args) {
        ClassLoader initClassloader =
Thread.currentThread().getContextClassLoader();
       
Thread.currentThread().setContextClassLoader(getCorrectClassloader(initClassloader));
        try {
            Method method = service.getClass().getMethod(methodName,
Arrays.stream(args).map(Object::getClass).toArray(Class[]::new));
            if (service instanceof GridServiceProxy) {
                return (T) ((GridServiceProxy) service).invokeMethod(method,
args);
            } else {
                return (T) method.invoke(service, args);
            }
        } catch (NoSuchMethodException | IllegalAccessException |
InvocationTargetException e) {
            throw new IllegalStateException("Error while method invoke: " +
methodName, e);
        } finally {
            Thread.currentThread().setContextClassLoader(initClassloader);
        }
    }
    private static ClassLoader getCorrectClassloader(ClassLoader
initClassloader) {
        ClassLoader correctClassloader = initClassloader;
        while (correctClassloader.getParent() != null &&
correctClassloader.getClass().getName().equals("org.apache.ignite.spi.deployment.uri.GridUriDeploymentClassLoader"))
{
            correctClassloader = correctClassloader.getParent();
        }
        return correctClassloader;
    }
}


But I don't understand what do you mean by "locally-deployed job with same
dependency"?

Your sincerely, Dmitry.





--
Sent from: http://apache-ignite-users.70518.x6.nabble.com/

Reply via email to