还有就是什麽时候一定要用EJB,是不是要调用的对象不在本地机器上时就要用RMI引用server上的对象,就要用到EJB的规范?
1.自己做缓存或对象池提高并发访问性能
2.自己安排使用事务跟踪。诸如xx.commit()之类语句
3.自己通过RMI实现跨服务器间对象调用,特别是一台机器无法满足需要,需要多台机器时,需要在这些机器之间实现负载动态平衡,javagroups这样广播发布机制可以实现这些底层通知。
我想就这三件事够你做几年的,如果你不想浪费几年时间,就用EJB吧。
除非你是特殊的实时系统,如游戏、或聊天等。聊天也可以使用JMS实现了。
我主要想不通的是:
比如我用sun的deploytool部署了一个Hello.jar文件。里面有Home,Remote,Enterprise javabean,三个文件(还有部署描述符文件),把它部署到weblogic服务器上,假设这个weblogic在服务器A上。那麽我在服务器B上想调用部署在A上weblogic中Hello.jar的一个方法(假设在控制台打印出一个hello,world),那麽我在B上就要用到RMI:
Context ctx=new InitialContext();
Object obj=ctx.lookup("java:comp/env/Hello");
........ ......... ........... ..........
但是他们在不同的机器上,是怎样进行对象调用的?是不是技术的关键在:"HelloHome home=(HelloHome)javax.rmi.PortableRemoteObject.narrow(
objRef,HelloHome.class);"
我看了Ed-Roman的Mastering EJB,上面说用的是stub存根,和skeleton实现的,但没有看懂,
*************
**主要我还是认为我上面关于服务器A和服务器B的理解有问题*
***************
如果有错误,请版主或哪位高手解释一下,多谢!
HelloHome home=(HelloHome)javax.rmi.PortableRemoteObject.narrow(
objRef,HelloHome.class);"
就可以调用了
objRef,HelloHome.class);"
能调用A(有Weblogic的)机器上的那个EJB吗?
至于服务器如何编译,我想不是因为一定要拷贝EJB到客户机B上,而是用了一个叫stub的客户端代理类实现的,但具体我不懂,我就是要问这个?
远程和本地接口是两种 Java RMI 远程接口。分布式对象使用 java.rmi.Remote 接口来表示不同地址空间(进程或机器)中的 bean。Enterprise Bean 是一种分布式对象。那表示 bean 类被实例化且在容器中存活,但存活在其它地址空间中的应用程序也访问它。
要使一个地址空间中的对象实例在另一个地址空间中可用,需要一些涉及网络套接字的技巧。要使该技巧生效,应将实例封装在一个称作“框架”的特殊对象中,该对象拥有到另一个叫作“存根”的特殊对象的网络连接。存根实现远程接口,因此它类似于一个商业对象。但存根不包含商业逻辑;它拥有到框架的网络套接字连接。每次在存根的远程接口上调用商业方法时,存根将网络消息发送到框架,告诉它调用了哪个方法。框架从存根接收到网络消息时,它标识所调用的方法以及自变量,然后调用真正的实例上的相应方法。实例执行商业方法,并将结果返回给框架,然后框架将结果发送给存根。
///////////////////////////////////////////////////////////////
说明在客户机B上不用编译这个EJB,用stub代理就可以了,不知我的理解对不对?