• 2004-05-25

    恶斗EJB(一)

    Tag:向上走

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://www.blogbus.com/dreamhead-logs/191077.html

    虽然近来EJB 3.0已经吵得沸沸扬扬,但作为EJB 3.0根基的JDK 1.5还不知道什么时候正式发布,享受EJB 3.0带来的便利指不定是在什么时候,眼下我们拥有的还只是麻烦的EJB 2.0。

    终于找到了一个使用EJB稍微合适一些的理由。系统要支持多机,其中最难解决的数据共享,于是我想到了EJB,也开始了与EJB艰苦的战斗。

    按照J2EE Tutorial在J2EE RI上跑通一个Hello级的EJB并不是什么难事。
    下面是我的Hello EJB的客户端代码:
        Context initial = new InitialContext();
        Context myEnv = (Context)initial.lookup("java:comp/env");
        Object objref = myEnv.lookup("ejb/HelloWorld");
           
        HelloWorldHome home = (HelloWorldHome)PortableRemoteObject.narrow(objref, HelloWorldHome.class);
        HelloWorld helloEJB = home.create();
        System.out.println(helloEJB.hello("dreamhead"));

    Hello的实现非常简单:
        public String hello(String name) {
            return "Hello, " + name;
        }

    照本宣科,把J2EE RI启动起来,运行客户端代码:
        set APPCPATH=HelloWorldAppClient.jar
        runclient -client HelloWorldApp.ear -name HelloWorldClient -textauth

    bingo!成功。

    这当然不是故事的结局,否则太对不起“恶斗”的题目了。
    我们最习惯的运行Java程序的方式是
        java classname
    而这里运行代码用得居然是runclient,J2EE RI自带的一个工具,显然这并不符合我们的日常行为规范。
    我的目标,直接用java运行EJB客户端。

    直接运行HelloWorldClient显然不行,如果你不信邪,可以自己尝尝失败的滋味。

    一些资料给了我些许提示,设置一些必要的属性会帮助也许可以帮助我完成任务。于是在代码中加上了这样几句:
        Properties env = new Properties();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.SerialInitContextFactory");
        env.put(Context.PROVIDER_URL, "iiop://xxx.xxx.xxx.xxx:1050");
    这里关注的主要是Context.INITIAL_CONTEXT_FACTORY和Context.PROVIDER_URL,它们其实是两个字符串,分别代表着“java.naming.factory.initial”和“java.naming.provider.url”,在一些资料里,它们往往素面示人。
    上面代码中给出的是针对J2EE RI的设置,不同的应用服务器设置是不同的,如果想在自己的应用服务器上使用类似的代码,先要找到自己的应用服务器上这两个参数是什么。因为关于J2EE RI的资料太少,就这两个参数,也害我花了好长时间。
    好容易找到的参数,写了一堆代码,可别忘了让它起作用啊!
        Context initial = new InitialContext(env);

    还有一个要改动的地方,那就是JNDI的名称。
    跟着J2EE Tutorial一路走来,我们很少在意代码中用以查找的那个“java:comp/env/ejb/HelloWorld”根本不是JNDI的名称,而只是一个引用名称。直接运行代码,给出的只是一个个错误提示。把它改回JNDI名称,问题迎刃而解。
        Object objref = initial.lookup("MyHelloWorld");

    J2EE的东西可不是随处可见的,所以,要自己运行的话,把J2EE RI的lib目录下的j2ee.jar拿过来会省去不少麻烦。另外,使用这个东西运行时可能会用到一些属性文件,我采用最直接的方式,将config目录下的东西直接搬了过来。

    代码可以编译了,别急着运行。想必听过EJB种种传闻的你一定知道Stub之类的东西,少了这个,代码绝对跑不起来,所以我们要把HelloWorldAppClient.jar加入到classpath中,传说中的Stub就在其中。

    我想许多人和我一样,跑这种例子会把server和client放在同一台机器上,上面的IP设置的是localhost或是本机IP。这样我们就可以幸福的通过第一关,看到EJB亲切的问候。

    万里长征终于走出第一步!

    分享到:

    历史上的今天:

    人多与人少 2006-05-25
    引用地址: