需要用RMI实现远程调用
因为是web应用,是用tomcat来发布,有几个问题,希望做过的大虾能为我解惑。
1 服务端必须在tomcat启动完成之前开启,其实也只是执行服务端类的一个方法就行。而服务端的绑定对象是通过spring 来注入的。所以第一个问题就是:什么时候来执行这个方法,在哪里执行。
2 我尝试写了一个servlet来启动这个方法,在setter方法中看到注入的对象为
...service = org.springframework.aop.framework.JdkDynamicAopProxy
然后在servlet的init方法中进入创建服务器端的方法,该对象变为null。第二个问题就是,为什么会出现这种情况。
3 我在远程对象的一个方法中返回了另一个对象
class UserService{
voidgetUserDao(UserDao userDao){
this.userDao = userDao;
}
}
然后在客户端想通过这个方法来获得userDao的引用时出错。
java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.lang.ClassNotFoundException: com.dao.UserDaoImpl (no security manager: RMI class loader disabled)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:178)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:178)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132)
at $Proxy0.getUserDao(Unknown Source)
at com.test.RmiClient.main(RmiClient.java:24)
Caused by: java.lang.ClassNotFoundException: com.dao.UserDaoImpl (no security manager: RMI class loader disabled)
at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:375)
at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:165)
at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:620)
at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:247)
at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:197)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1575)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
at sun.rmi.server.UnicastRef.unmarshalValue(UnicastRef.java:306)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:155)
... 4 more
希望有知道的大虾能解答下。如果哪位大哥有这方面的例子共享下,小弟将不胜感激。