AOP / Remoting problem with DR2
noa Jan 27, 2004 11:10 AM
"noa" wrote:
I have had some difficulty getting remote communication to work with DR2. I will try soon with the latest code to see if that helps. I would simply like to have a client in one java process that executes a method on a regular java class that is deployed within jboss. I have an mbean contained within a deployed .sar file that registers a plain java object with the Dispatcher, as indicated in the aop documentation with the following syntax:
POJO pojo = new POJO();
Dispatcher.singleton.registerTarget("myobj", pojo);
The mbean also creates the proxy and performs a jndi binding, similar to:
POJO proxy = (POJO)Remoting.createRemoteProxy("myobj", pojo.getClass(), "socket://servername:8084");
new InitialContext().bind("YourOwnObjectId", proxy);
This all seems to work just fine.
I have tried a couple of approaches towards attempting to communicate with the pojo outside of jboss. I attempt to create the proxy object in the client and invoke a method, as in the following:
POJO me = (POJO) Remoting.createRemoteProxy("myobj", POJO.class, "socket://localhost:8084");
me.talk();
This results in the following error on the client:
java.lang.SecurityException: Prohibited package name: java.lang
at java.lang.ClassLoader.defineClass(ClassLoader.java:488)
at java.lang.ClassLoader.defineClass(ClassLoader.java:431)
at org.jboss.remoting.loading.ClassByteClassLoader.addClass(ClassByteClassLoader.jav a:196)
at org.jboss.remoting.AbstractInvoker.addClass(AbstractInvoker.java:192)
at org.jboss.remoting.AbstractInvoker.unmarshal(AbstractInvoker.java:279)
at org.jboss.remoting.RemoteClientInvoker.invoke(RemoteClientInvoker.java:161)
at org.jboss.remoting.Client.invoke(Client.java:144)
at org.jboss.aop.remoting.InvokeRemoteInterceptor.invoke(InvokeRemoteInterceptor.jav a:41)
at org.jboss.aop.Invocation.invokeNext(Invocation.java:61)
at org.jboss.aop.remoting.MergeMetaDataInterceptor.invoke(MergeMetaDataInterceptor.j ava:60)
at org.jboss.aop.Invocation.invokeNext(Invocation.java:61)
at org.jboss.aop.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:33)
at org.jboss.aop.Invocation.invokeNext(Invocation.java:61)
at org.jboss.aop.proxy$test.POJO._added_m$0(POJO.java)
at org.jboss.aop.proxy$test.POJO.talk(POJO.java)
at test.MyClient.main(MyClient.java:53)
Checking out the jboss logs, I see the following server-side error:
11:31:35,486 ERROR [STDERR] org.jboss.remoting.SubsystemNotSupported: Subsystem
'AOP' not supported on target VM (InvokerLocator [socket://{ip_addr}:8084/])
11:31:35,486 ERROR [STDERR] at org.jboss.remoting.ServerInvoker.invoke(Serve
rInvoker.java:310)
11:31:35,486 ERROR [STDERR] at org.jboss.remoting.ServerInvoker.invoke(Serve
rInvoker.java:250)
11:31:35,486 ERROR [STDERR] at org.jboss.remoting.transport.socket.SocketSer
verInvoker$Client.run(SocketServerInvoker.java:208)
And if I give up on this approach, and try instead to retrieve the POJO proxy from JNDI, I receive the following error upon execution of the lookup:
javax.naming.CommunicationException. Root exception is java.lang.ClassNotFoundException: org.jboss.aop.proxy$test.POJO
at java.net.URLClassLoader$1.run(URLClassLoader.java:198)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:186)
at java.lang.ClassLoader.loadClass(ClassLoader.java:299)
at java.lang.ClassLoader.loadClass(ClassLoader.java:255)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:315)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:217)
at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:427)
at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:161)
at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:631)
at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:257)
at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:200)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1513)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1435)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1626)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)
at java.rmi.MarshalledObject.get(MarshalledObject.java:135)
at org.jnp.interfaces.MarshalledValuePair.get(MarshalledValuePair.java:30)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:522)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:479)
at javax.naming.InitialContext.lookup(InitialContext.java:347)
at test.MyClient.main(MyClient.java:45)
I did notice that if instead of the proxy I bind the POJO itself into JNDI (now object type is simply test.POJO, not org.jboss.aop.proxy$test.POJO), the context lookup works just fine.
I suspect I am neglecting some basic configuration requirement in one or both of these approaches. Any help would be appreciated -- or should I give up this entirely and work with the latest code?
Thanks