Terracotta Master Worker + Guice

View: New views
1 Messages — Rating Filter:   Alert me  

Terracotta Master Worker + Guice

by Adam Bender-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Greetings,

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