CSDN博客

img zlsunnan

恶斗EJB(一)

发表于2004/10/11 11:48:00  1447人阅读

分类: J2EE

虽然近来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亲切的问候。

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

阅读全文
0 0

相关文章推荐

img
取 消
img