[
https://issues.apache.org/jira/browse/IGNITE-13633?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17226631#comment-17226631
]
Aleksey Plekhanov commented on IGNITE-13633:
--------------------------------------------
Root cause: Implementations of {{ServiceDescriptor}} know nothing about
deployment SPI, every {{ServiceDescriptor.serviceClass()}} usage is prone to
this error (thin client services, .NET services, services system view, public
API). Simlified reproducer:
{code:java}
public class ServiceWithDeploymentSpiTest extends GridCommonAbstractTest {
private Path srcTmpDir;
@Override protected IgniteConfiguration getConfiguration(String
igniteInstanceName) throws Exception {
IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
cfg.setDeploymentSpi(new LocalDeploymentSpi());
return cfg;
}
@Before
public void prepare() throws IOException {
srcTmpDir = Files.createTempDirectory(getClass().getSimpleName());
}
@After
public void cleanup() {
U.delete(srcTmpDir);
}
@Test
public void testServiceWithDeploymentSpi() throws Exception {
URLClassLoader clsLdr = prepareClassLoader();
Class<?> cls = clsLdr.loadClass("MyServiceImpl");
Service srvc = (Service)cls.newInstance();
Ignite ignite = startGrid(0);
DeploymentSpi depSpi = ignite.configuration().getDeploymentSpi();
depSpi.register(clsLdr, srvc.getClass());
ignite.services().deployClusterSingleton("test-service", srvc);
for (ServiceDescriptor desc : ignite.services().serviceDescriptors()) {
if ("test-service".equals(desc.name()))
assertEquals(cls, desc.serviceClass());
}
}
private URLClassLoader prepareClassLoader() throws Exception {
String src = "import org.apache.ignite.services.Service;\n" +
"import org.apache.ignite.services.ServiceContext;\n" +
"public class MyServiceImpl implements Service {\n" +
" @Override public void cancel(ServiceContext ctx) {}\n" +
" @Override public void init(ServiceContext ctx) throws
Exception {}\n" +
" @Override public void execute(ServiceContext ctx) throws
Exception {}\n" +
"}";
Files.createDirectories(srcTmpDir);
File srcFile = new File(srcTmpDir.toFile(), "MyServiceImpl.java");
Path srcFilePath = Files.write(srcFile.toPath(),
src.getBytes(StandardCharsets.UTF_8));
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
compiler.run(null, null, null, srcFilePath.toString());
assertTrue("Failed to remove source file.", srcFile.delete());
return new URLClassLoader(new URL[] {srcTmpDir.toUri().toURL()});
}
}
{code}
> thin clients cannot access the Ignite Service deployed through
> UriDeploymentSpi( java.lang.ClassNotFoundException)
> ------------------------------------------------------------------------------------------------------------------
>
> Key: IGNITE-13633
> URL: https://issues.apache.org/jira/browse/IGNITE-13633
> Project: Ignite
> Issue Type: Bug
> Components: managed services, thin client
> Affects Versions: 2.9
> Reporter: xingzhou
> Assignee: Aleksey Plekhanov
> Priority: Critical
> Fix For: 2.9.1
>
> Attachments: ignite-deploy.zip
>
> Original Estimate: 24h
> Remaining Estimate: 24h
>
> When the thin client is used to call the ignite service( use ignite-urideploy
> ), the clientserviceinvokerequest will get the service classes, the local
> classloader is used, and the classes cannot be found. Therefore, the
> ignite-urideploy classloader should be added
--
This message was sent by Atlassian Jira
(v8.3.4#803005)