MyException - 我的异常网
当前位置:我的异常网» 软件架构设计 » EJB 工作原理一

EJB 工作原理一

www.MyException.Cn  网友分享于:2013-11-19  浏览:1次
EJB 工作原理1

首先,我想先说说RMI的工作原理,因为EJB毕竟是基于RMI的嘛。废话就不多讲了,RMI的本质就是实现在不同JVM之间的调用.

它的实现方法就是在两个JVM中各开一个Stub和Skeleton,二者通过socket通信来实现参数和返回值的传递。

有关RMI的例子代码网上可以找到不少,但绝大部分都是通过extend the interface java.rmi.Remote实现,已经封装的很完善了,不免使人有雾里看花的感觉。下面的例子是我在《Enterprise JavaBeans》里看到的,虽然很粗糙,但很直观,利于很快了解它的工作原理。

  1. 定义一个Person的接口,
   其中有两个business method, getAge() 和getName()


代码
public interface Person {   
    public int getAge() throws Throwable;   
    public String getName() throws Throwable;   
}   


2. Person的实现PersonServer类

代码
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;   
     }   
}   


3. 好,我们现在要在Client机器上调用getAge()和getName()这两个business method,那么就得编写相应的Stub(Client端)和Skeleton(Server端)程序。这是Stub的实现:

代码
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();   
     }   
}   


注意,Person_Stub和PersonServer一样,都implements Person。它们都实现了getAge()和getName()两个business method,不同的是PersonServer是真的实现,Person_Stub是建立socket连接,并向Skeleton发请求,然后通过Skeleton调用PersonServer的方法,最后接收返回的结果。

4. Skeleton实现

代码
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();   
     }   
}   


Skeleton类 extends from Thread,它长驻在后台运行,随时接收client发过来的request。并根据发送过来的key去调用相应的business method。

  5. 最后一个,Client的实现

代码
public class PersonClient {   
    public static void main(String [] args) {   
        try {   
             Person person = new Person_Stub();   
            int age = person.getAge();   
             String name = person.getName();   
             System.out.println(name + " is " + age + " years old");   
         } catch(Throwable t) {   
             t.printStackTrace();   
         }   
     }   
}   


Client的本质是,它要知道Person接口的定义,并实例一个Person_Stub,通过Stub来调用business method,至于Stub怎么去和Server沟通,Client就不用管了。

注意它的写法:
Person person = new Person_Stub();
而不是
Person_Stub person = new Person_Stub();

为什么?因为要面向接口编程嘛,呵呵。

文章评论

程序员必看的十大电影
程序员必看的十大电影
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
每天工作4小时的程序员
每天工作4小时的程序员
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
程序员的鄙视链
程序员的鄙视链
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
那些争议最大的编程观点
那些争议最大的编程观点
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
我是如何打败拖延症的
我是如何打败拖延症的
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
漫画:程序员的工作
漫画:程序员的工作
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
老程序员的下场
老程序员的下场
鲜为人知的编程真相
鲜为人知的编程真相
10个调试和排错的小建议
10个调试和排错的小建议
Java程序员必看电影
Java程序员必看电影
程序员都该阅读的书
程序员都该阅读的书
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
编程语言是女人
编程语言是女人
为什么程序员都是夜猫子
为什么程序员都是夜猫子
一个程序员的时间管理
一个程序员的时间管理
 程序员的样子
程序员的样子
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
中美印日四国程序员比较
中美印日四国程序员比较
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
如何成为一名黑客
如何成为一名黑客
代码女神横空出世
代码女神横空出世
程序员和编码员之间的区别
程序员和编码员之间的区别
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
我的丈夫是个程序员
我的丈夫是个程序员
旅行,写作,编程
旅行,写作,编程
程序员应该关注的一些事儿
程序员应该关注的一些事儿
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有