`

EJB RMI 通信原理与流程

    博客分类:
  • EJB
 
阅读更多

EJB 是 RMI 的封装框架,实现了RMI的功能。

RMI:
    Remote Method Invocation 远程方法调用。用于不同的jvm间通信,由 jdk:java.rmi.Remote 接口实现。

    对于异步通信需要四个关键的类
        接口  接口实现类  实现类存根stub(用于客户端)  实现类框架Skeleton(用于服务端)

        stub 和 skeleton 就是两个jvm端的通信兵(接口人),stub 告诉 skeleton 我要调用哪个方法,
        skeleton 调用服务器端实现类来调用具体的方法,并将结果返回给 stub。

        虽然 stub 和 skeleton 都是 接口的实现类,但在客户端只需要 接口 和 stub 就行了。

//RMI 示例:
        // 接口
        public interface Person
        {
            public int getAge() throws Throwable;
            public String getName() throws Throwable;
        }

        // 接口实现类 方法返回具体的消息
        public class PersonServer implements Person
        {
            int age;
            String name;

            public PersonServer(String name, int age) {
                this.age = age;
                this.name = name;
            }

            public int getAge(){
                return age;
            }

            public String getName(){
                return name;
            }
        }

        // 客户端操作 stub类  负责告诉 skeleton :我要调用哪个方法
        import java.io.ObjectOutputStream;
        import java.io.ObjectInputStream;
        import java.net.Socket;

        public class Person_Stub implements Person {
            Socket socket;

            public Person_Stub(); throws Throwable {
                // connect to skeleton
                socket = new Socket("computer_name", 9000);
            }

            public int getAge(); throws Throwable {
                // pass method name to skeleton
                ObjectOutputStream outStream =
                    new ObjectOutputStream(socket.getOutputStream(););;
                outStream.writeObject("age");;
                outStream.flush();;

                ObjectInputStream inStream =
                    new ObjectInputStream(socket.getInputStream(););;
                return inStream.readInt();;
            }

            public String getName(); throws Throwable {
                // pass method name to skeleton
                ObjectOutputStream outStream =
                    new ObjectOutputStream(socket.getOutputStream(););;
                outStream.writeObject("name");;
                outStream.flush();;

                ObjectInputStream inStream =
                    new ObjectInputStream(socket.getInputStream(););;
                return (String);inStream.readObject();;
            }
        }

        // 服务端skeleton类  负责通过实现类 调用stub类指定的方法
        import java.io.ObjectOutputStream;
        import java.io.ObjectInputStream;
        import java.net.Socket;
        import java.net.ServerSocket;

        public class Person_Skeleton extends Thread {
            PersonServer myServer;

            public Person_Skeleton(PersonServer server); {
                // get reference of object server
                this.myServer = server;
            }

            public void run(); {
                try {
                    // new socket at port 9000
                    ServerSocket serverSocket = new ServerSocket(9000);;
                    // accept stub's request
                    Socket socket = serverSocket.accept();;

                    while (socket != null); {
                        // get stub's request
                        ObjectInputStream inStream =
                            new ObjectInputStream(socket.getInputStream(););;
                        String method = (String);inStream.readObject();;

                        // check method name
                        if (method.equals("age");); {
                            // execute object server's business method
                            int age = myServer.getAge();;
                            ObjectOutputStream outStream =
                                new ObjectOutputStream(socket.getOutputStream(););;

                            // return result to stub
                            outStream.writeInt(age);;
                            outStream.flush();;
                        }

                        if(method.equals("name");); {
                            // execute object server's business method
                            String name = myServer.getName();;
                            ObjectOutputStream outStream =
                                new ObjectOutputStream(socket.getOutputStream(););;

                            // return result to stub
                            outStream.writeObject(name);;
                            outStream.flush();;
                        }
                    }
                } catch(Throwable t); {
                    t.printStackTrace();;
                    System.exit(0);;
                }
            }

            public static void main(String args []); {
                // new object server
                PersonServer person = new PersonServer("Richard", 34);;

                Person_Skeleton skel = new Person_Skeleton(person);;
                skel.start();;
            }
        }

 

 

 

EJB:
    stub 和 skeleton 类由服务器部署时动态生成。
    普通的RMI需要在客户端保存stub类,而EJB不需要,因为服务器会把stub类的对象实例发送给客户端。

    EJB 实现了RMI的功能需要一个类和两个接口,由框架或服务器生成的类会根据不同的服务器生成不同的类。
        由于不同的 服务器 之间交互的方式不同,比如 weblogic 和 jboss 的通信端口不一样,实现的机制
        也不一样。要根据不同的服务器,生成用于对应服务器的通信类。
        比如 weblogic 在部署ejb时,就会生成用于 weblogic 通信的 stub 和 skeleton 字节码文件。
        EJB会根据不同的服务器有针对性的生成 bean 类的实现类。

    用户编写            EJBC生成          部署时动态生成字节码文件
    bean  类            实现类
    remote接口          实现类               stub   skeleton
    home  接口          实现类               stub   skeleton

    EJB 的因此远程通信至少要有两次 RMI 先敲门,后通信 。
    第一次是 Home 接口的 RMI ,home接口 stub 通知 skeleton 开始ejb通信。然后home接口会生成
        remote接口 的 stub 字节码文件 并传递给 客户端 用于通信。
    第二次是 remote接口 真正开始通信。

    由于在EJB中,客户端只需要存两个类 home 和 remote 接口,当需要跟服务器端通信时,先通知服务器
    获得 通信的 stub ,然后再进行通信。
    也就是说 EJB 中,home RMI 仅仅是为了将 Remote 接口的stub传递给客户端。
    然后客户端通过得到的 remote 接口的 stub 直接跟服务器进行通信。

    先敲门,后通信。敲门的过程中我们可以进行身份验证等等。

    流程示例:

        // 获得 home 接口的 stub
        Home home = (Home) PortableRemoteObject.narrow(ctx.lookup("Hello"), HelloHome.class);

        // 通过 home_stub 获得 remote_stub
        Remote remote = home.create();

        // remote_stub 与 服务器进行通信
        remote.helloword();

 

流程实例2:

EJB调用流程:
    class:
        SessionBean
        Service 分发调用 local / remote home

    interface:
        EJBObject
        EJBHome     create   EJBObject

        EJBLocalObject
        EJBLocalHome    create      EJBLocalObject
   
    Home 负责创建 EJBObject
    EJBObject 通过框架调用 SessionBean
       
struts请求调用流程:
    action 调用 Service 的方法
    Service 分发调用 local / remote home
    EJBObject / EJBLocalObject 框架调用 SessionBean  (框架是如何知道调用哪个SessionBean的呢?) 
    SessionBean 调用 persistents 层

分享到:
评论

相关推荐

    EJB原理图:EJB工作原理

    通过上述分析,我们可以看到EJB的工作原理涉及到了多个层次的概念和技术,包括EJB容器、客户端和服务端代理对象、远程调用技术(RMI)、网络通信(Socket)以及命名和目录服务(JNDI)。这些元素共同协作,使得EJB...

    EJB rmi-overview PPT

    在RMI中,远程方法调用的过程可以分为以下几个关键点: 1. **远程接口(Remote Interface)**: - 为了实现远程调用,首先需要定义一个接口,该接口需要继承自`java.rmi.Remote`。接口中的每个方法都要声明抛出`...

    EJB工作原理

    EJB利用RMI机制实现客户端与服务器端的通信,具体过程如下: 1. **定义远程接口**:如`Person`接口,其中包含`getAge()`和`getName()`等方法。 2. **实现远程接口**:通过`PersonServer`类实现`Person`接口,其中...

    《EJB-RMI入门》

    EJB是一种组件模型,用于构建可部署在Java应用服务器上的业务逻辑,RMI则是EJB组件之间以及与客户端通信的基础。 总的来说,RMI是Java开发者构建分布式系统的重要工具,它的易用性、灵活性和跨平台特性使得Java在...

    RMI原理及应用详解

    3. **Web服务器与应用服务器间的通信**: 如Servlets通过RMI与EJB交互。 4. **网格计算**: 在大规模分布式计算环境中,RMI可用于节点间的协调和通信。 5. **集群管理**: 在Java集群系统中,RMI用于节点间的监控、...

    EJB工作原理学习笔记.pdf

    EJB的核心在于将业务逻辑与底层的技术细节分离,使得开发者可以专注于编写业务逻辑而不必关心底层的网络通信或并发控制等复杂问题。通过RMI、WebSphere和WebLogic等技术的支持,EJB为构建大型分布式应用提供了坚实的...

    一个完整的Java RMI通讯的例子

    在这个例子中,我们将深入理解RMI的基本概念、工作原理以及如何创建一个完整的RMI通信系统。 首先,我们要知道RMI的核心思想是将对象的接口和其实现分开,接口在客户端,实现则在服务器端。当客户端调用接口方法时...

    rmi使用实例

    RMI 的设计目标是为了简化企业级应用中的远程对象交互过程,它可以作为 Enterprise JavaBeans (EJB) 的一种替代方案。 #### 二、RMI 工作原理 RMI 的核心思想在于通过远程代理(Stub)和远程框架(Skeleton)来实现...

    RMI可运行的示例代码

    - 可能还包括测试用例,用于验证RMI通信是否正确工作。 要运行这个示例,你需要确保Java环境已经配置好,包括设置JDK路径,启动RMI注册表,编译源代码,然后分别运行服务器和客户端程序。通过调试和分析这个示例,...

    RMI原理及实现,ppt格式

    - 对于EJB(Enterprise JavaBeans)组件,虽然Java提供了Socket通信接口,但RMI提供了更高级别的抽象,使得远程对象调用更加便捷。 5. **RMI服务器**: - 远程RMI服务需要在一个服务器进程中运行,例如Calculator...

    rmi原理-chn-pdf

    - **EJB**:在J2EE体系中,EJB(Enterprise JavaBeans)组件利用RMI作为其底层通信机制之一,实现了组件之间的远程调用。 #### 总结 RMI作为一种成熟的分布式计算技术,极大地简化了开发者的工作量,使得跨JVM的...

    EJB介绍

    总结来说,EJB是Java为企业级应用提供的一个强大的框架,它通过RMI实现远程对象调用,支持服务集群和分布式计算,使得开发者可以专注于业务逻辑,而无需过多关注底层的网络通信和资源管理。EJB与JSP(JavaServer ...

    EJB工作原理学习笔记

    它是一个本地代理,负责与远程对象通信。 4. **服务器端骨架(Skeleton)**: 在服务器端,骨架负责处理来自客户端的请求,并将请求转发给实际的服务实现。 ##### 工作流程 1. **客户端**: - 创建一个存根实例。 - ...

    精通RMI程序代码

    - **RMI与EJB的结合**:EJB(Enterprise JavaBeans)是Java EE的一部分,RMI常用于EJB组件之间的通信,尤其是无状态会话bean和实体bean。 - **RMI优化**:提高RMI性能的策略,例如减少远程方法调用,优化数据传输,...

    java RMI实现代码

    本项目提供的“java RMI实现代码”包括客户端和服务器端的示例,通过清晰的代码注释帮助理解RMI的工作原理。 一、RMI的基本概念 1. 远程接口:远程接口定义了客户端和服务器之间通信的API,它是Java接口,标注了`@...

    RMI协议的应用与研究

    在Java中,RMI的工作流程大致如下: 1. **定义远程接口**:首先,我们需要定义一个Java接口,该接口声明了所有可被远程调用的方法。这些方法必须是public,并且没有void返回类型,因为远程调用通常需要返回一个结果...

    RMI.rar_Java RMI_java.rmi_java.rmi.Remot_remote

    Java RMI(远程方法调用)是Java编程语言中的一项核心技术,自JDK 1.1版本起就被引入...虽然现代的Java框架如Spring、EJB等提供了更高级别的分布式服务,但理解RMI的基本原理对于深入学习Java分布式系统仍然是必要的。

Global site tag (gtag.js) - Google Analytics