tee4cute
tee4cute

Reputation: 25

Gigaspaces: Dynamic "Template Class" loading causes "ClassNotFoundException" on TypeManager.registerTypeDescriptor(Class)

Gigaspaces 9.6, Java 6

I'm developing module system which dynamically load module's classes from external .jar files which are not in SYSTEM CLASS PATH. Each module has its own class loader (for sandboxing purpose). Once I've loaded TEMPLATE CLASS from external jar and register it to TypeManager, it causes the ClassNotFoundException.

(I've tried to work around by adding .jar containing template class to system class path and it works! This shows that the LRMI's dynamic class loading is normally working.)

Here is the stack trace:

WARNING: Async execution failed: java.lang.ClassNotFoundException: DefaultClassProvider [4756891978928899637] could not locate required class [employeedb.dto.Employee] at the specified class loader [1], request=com.tum.108af67ad46743668d724c8caa45e160_container1:com.tum.108af67ad46743668d724c8caa45e160=>RegisterEntryTypeDescriptorSpaceOperationRequest[typeName=employeedb.dto.Employee,checksum=1804124240,gatewayProxy=false] SEVERE: org.openspaces.core.SpaceMetadataException: Error in registerTypeDescInServers() remote task execution. TypeName=employeedb.dto.Employee; nested exception is java.lang.ClassNotFoundException: DefaultClassProvider [4756891978928899637] could not locate required class [employeedb.dto.Employee] at the specified class loader [1] at org.openspaces.core.exception.DefaultExceptionTranslator.internalTranslate(DefaultExceptionTranslator.java:126) at org.openspaces.core.exception.DefaultExceptionTranslator.translate(DefaultExceptionTranslator.java:50) at org.openspaces.core.DefaultGigaSpaceTypeManager.registerTypeDescriptor(DefaultGigaSpaceTypeManager.java:73) at com.magpieos.core.nestvm.PersistenceServiceManager.registerTypeDescriptor(PersistenceServiceManager.java:146) at com.magpieos.core.nestvm.PersistenceServiceManager.registerTypeDescriptor(PersistenceServiceManager.java:140) at com.magpieos.core.nestvm.PersistenceServiceManager.registerTypeDescriptor(PersistenceServiceManager.java:136) at com.filter.PortalActionFilter.myInit(PortalActionFilter.java:210) at com.filter.PortalActionFilter.doFilter(PortalActionFilter.java:113) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) at com.sun.grizzly.ContextTask.run(ContextTask.java:71) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) at java.lang.Thread.run(Thread.java:662) Caused by: java.lang.ClassNotFoundException: DefaultClassProvider [4756891978928899637] could not locate required class [employeedb.dto.Employee] at the specified class loader [1] at com.gigaspaces.lrmi.classloading.DefaultClassProvider.getClassDefinition(DefaultClassProvider.java:109) at com.gigaspaces.lrmi.classloading.IClassProviderGigaspacesMethodinternalInvoke2.internalInvoke(Unknown Source) at com.gigaspaces.internal.reflection.fast.AbstractMethod.invoke(AbstractMethod.java:41) at com.gigaspaces.lrmi.LRMIRuntime.invoked(LRMIRuntime.java:450) at com.gigaspaces.lrmi.nio.Pivot.consumeAndHandleRequest(Pivot.java:557) at com.gigaspaces.lrmi.nio.Pivot.handleRequest(Pivot.java:658) at com.gigaspaces.lrmi.nio.Pivot$ChannelEntryTask.run(Pivot.java:196) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) ... 1 more

My Question is:

Am I able to implement my own class loader which will DELEGATE class loading to external jars if that class is not present in regular LRMI Server's(GSC's) / LRMI Client's CLASS PATH?

Upvotes: 0

Views: 298

Answers (1)

Edmondo
Edmondo

Reputation: 20090

If you see the ClassLoader part of GigaSpaces GigaSpaces Wiki - Class Loaders it says:

In terms of class loader delegation model, the service (PU instance) class loader uses a parent last delegation mode. This means that the processing unit instance class loader will first try and load classes from its own class loader, and only if they are not found, will delegate up to the parent class loader.

If you also look down there is a description of classloader hierarchy used:

       Bootstrap (Java)

              |
           System (Java)
              |
           Common (Service Grid)
         /        \
Service CL1     Service CL2

So I would suggest you use the JVM parameter java.system.class.loader to start your JVM with a different system classloader, so that when GigaSpaces will delegate up, your class loader will find the classes

Upvotes: 0

Related Questions