|
View:
New views
1 Messages
—
Rating Filter:
Alert me
|
|
|
Terracotta Master Worker + GuiceGreetings,
I have been trying to get a Terracotta Master Worker project going with Guice but I seem to have run into a problem with Guice's Provider class. Every time I try to inject a class with a Provider i.e @Inject public void MyAppService(Provider<DAOService> daoProvider) { ... } I am getting a class not found exception on the class that is bound as the provider, even if I instrument the class explicitly. In terms of code I have the following ----- Provider ------ public class DAOServiceProvider implements Provider<DAOService> { public DAOService get() { return new DAOServiceImpl(); } } ---- Master ------- public class WorkMaster { public void run() { Injector injector = Guice.createInjector(new AbstractModule() { @Override protected void configure() { bind(DAOService.class).toProvider(DAOServiceProvider.class); } }); Work work = injector.getInstance(Work.class); } } ---- Worker ---- public class Work implements Callable<int> { private Provider<DAOService> serviceProvider; @Inject public Work(Provider<DAOService> serviceProvider) { this.serviceProvider = serviceProvider; } public int call() throws Exception { return serviceProvider.get().getUserCount(); } } ---- tc-config.xml ----- <?xml version="1.0" encoding="UTF-8"?> <con:tc-config xmlns:con="http://www.terracotta.org/config"> <servers> <server host="%i" name="localhost"> <dso-port>9510</dso-port> <jmx-port>9520</jmx-port> <data>terracotta/server-data</data> <logs>terracotta/server-logs</logs> <statistics>terracotta/cluster-statistics</statistics> </server> </servers> <clients> <logs>terracotta/client-logs</logs> <modules> <module name="tim-masterworker" version="2.1.1" /> <module name="tim-guice-1.0" version="1.2.1" /> </modules> </clients> <application> <dso> <instrumented-classes> <include> <class-expression>com.magpieti.terraguice.*</class-expression> </include> <include> <class-expression>c com.magpieti.terraguice.DAOServiceProvider$$FastClassByGuice</class-expression> </include> <include> <class-expression>com.google.inject.*</class-expression> </include> </instrumented-classes> <additional-boot-jar-classes> <include>sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl</include> <include>sun.reflect.annotation.AnnotationInvocationHandler</include> <include>sun.reflect.generics.repository.ConstructorRepository</include> <include>sun.reflect.generics.factory.CoreReflectionFactory</include> <include>sun.reflect.generics.tree.MethodTypeSignature</include> <include>sun.reflect.generics.scope.ConstructorScope</include> <include>sun.reflect.generics.tree.ClassTypeSignature</include> <include>sun.reflect.generics.tree.VoidDescriptor</include> <include>sun.reflect.generics.tree.SimpleClassTypeSignature</include> </additional-boot-jar-classes> </dso> </application> </con:tc-config> Currently, when the "serviceProvider.get().getUserCount()' is executed I get the following stack trace com.tc.exception.TCClassNotFoundException: java.lang.ClassNotFoundException: com.magpieti.terraguice.DAOServiceProvider $$FastClassByGuice$$4081c943 at com.tc.object.TCObjectPhysical.resolveReference(TCObjectPhysical.java:151) at com.google.inject.cglib.reflect.FastMember.__tc_getfc(FastMember.java) at com.google.inject.cglib.reflect.FastConstructor.newInstance(FastConstructor.java:40) at com.google.inject.DefaultConstructionProxyFactory$2.newInstance(DefaultConstructionProxyFactory.java:67) at com.google.inject.ConstructorInjector.construct(ConstructorInjector.java:142) at com.google.inject.InjectorImpl$ImplicitBinding.get(InjectorImpl.java:1006) at com.google.inject.BoundProviderFactory.get(BoundProviderFactory.java:60) at com.google.inject.InjectorImpl$9$1.call(InjectorImpl.java:708) at com.google.inject.InjectorImpl.callInContext(InjectorImpl.java:747) at com.google.inject.InjectorImpl$9.get(InjectorImpl.java:702) at com.magpieti.terraguice.Work.call(SimpleWork.java:24) at com.magpieti.terraguice.Work.call(SimpleWork.java:1) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:270) at java.util.concurrent.FutureTask.run(FutureTask.java:55) at org.terracotta.executor.support.DefaultDistributedWork.run(DefaultDistributedWork.java:25) at org.terracotta.executor.DistributedWorkerService.doExecute(DistributedWorkerService.java:92) at org.terracotta.masterworker.AbstractWorker$WorkPipeListener$1.run(AbstractWorker.java:131) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:270) at java.util.concurrent.FutureTask.run(FutureTask.java:55) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:637) Caused by: java.lang.ClassNotFoundException: com.magpieti.terraguice.DAOServiceProvider$$FastClassByGuice$$4081c943 at java.net.URLClassLoader$1.run(URLClassLoader.java:200) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at sun.misc.Launcher$AppClassLoader.findClass(Launcher.java) at java.lang.ClassLoader.loadClass(ClassLoader.java:319) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:330) at java.lang.ClassLoader.loadClass(ClassLoader.java:254) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:399) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:247) at com.tc.object.loaders.StandardClassProvider.getClassFor(StandardClassProvider.java:88) at com.tc.object.ClientObjectManagerImpl.lookup(ClientObjectManagerImpl.java:539) at com.tc.object.ClientObjectManagerImpl.lookupObject(ClientObjectManagerImpl.java:442) at com.tc.object.ClientObjectManagerImpl.lookupObject(ClientObjectManagerImpl.java:430) at com.tc.object.TCObjectPhysical.resolveReference(TCObjectPhysical.java:149) ... 22 more Is it immediately obvious anyone why this would be a problem? Why is the Terracotta class loader unable to find this particular class? As a side note, if I inject the class that the Provider is providing instead of the whole provider it seems to work. Thanks, Adam _______________________________________________ tc-users mailing list tc-users@... http://lists.terracotta.org/mailman/listinfo/tc-users |
| Free embeddable forum powered by Nabble | Forum Help |