恶斗EJB(二)

原创 2004年10月11日 11:50:00

我们的最终目的是在不同的机器上调用EJB,下面就该体验分布式了。
在另外一台机器上,架起一个Server,把EJB部署上去,然后改动client代码中的IP,准备,跑!
成功了吗?
我期望的是失败。
如果你看见了来自远程的问候,先别兴奋,看看运行client的机器上是否还跑着一个J2EE RI呢?
我调的是远程的EJB,和我本机起的server有什么关系呢?先别管这些,关了它。
恭喜你,代码终于正常的失败了。

谁愿意面对失败呢?出现了问题,我们要做就是解决它。
异常的提示是个不错的起点。
    javax.naming.CommunicationException: Can't find SerialContextProvider
        at com.sun.enterprise.naming.SerialContext.getProvider(SerialContext.java:63)
        at com.sun.enterprise.naming.SerialContext.lookup(SerialContext.java:120)
        at javax.naming.InitialContext.lookup(Unknown Source)
        ……
显然,这不是很好的提示,因为我们无法通过异常信息获得更多,但我们知道了出现错误的类。
幸运的是,SUN的J2EE RI源代码是公开的,这样我就省去了反编译class文件的麻烦。
打开com.sun.enterprise.naming.SerialContext这个类,找到getProvider,其中的一个debug变量引起了我的兴趣,这是一个调试的标志,只要把它置为true,一些调试信息就会流出来。
我肯定了自己的想法,改变debug,但如何来编译源代码呢?
我并不想费尽心力去编译J2EE RI庞大的源码,毕竟我需要的只是改变其中的一个类,而不是研究整个J2EE RI。

挥出自己常用法宝,在自己的IDE中建立,建立起一个工程之后,直接把包含目标类的JAR文件(可能还有一些比较的JAR文件)加入工程,这样编译这个类所需的全部内容就都有了。
取过我的目标类,按照包结构放入工程之中,这样代码应该就可以正常编译了。
将改动后的class文件再塞进JAR,这样我的改动就开始发挥作用了。

通过改动,我们可以多一些信息。
    org.omg.CORBA.COMM_FAILURE:   vmcid: SUN  minor code: 201  completed: No
        at com.sun.corba.ee.internal.iiop.ConnectionTable.getConnection(ConnectionTable.java:176)
        at com.sun.corba.ee.internal.iiop.ConnectionTable.getConnection(ConnectionTable.java:68)
        at com.sun.corba.ee.internal.iiop.GIOPImpl.getConnection(GIOPImpl.java:70)
        ……
CORBA错误?是的,CORBA。这就不太好办了,虽然听说过EJB和CORBA之间千丝万缕的联系,但是我可是标准的CORBA门外汉。
在下定决心不去从头学习CORBA之后,我决定继续用前面的手法挖掘问题的原因。

逆流而上的结果是我发现了这样的信息。
    com.sun.corba.ee.internal.iiop.GIOPImpl(Thread[main,5,main]): getEndpoint(IIOP_CLEAR_TEXT, 0, null)
    com.sun.corba.ee.internal.iiop.GIOPImpl(Thread[main,5,main]): createListener( socketType = IIOP_CLEAR_TEXT port = 0 )
    com.sun.corba.ee.internal.iiop.ConnectionTable(Thread[main,5,main]): Client get called: host = localhost port = 1050
    com.sun.corba.ee.internal.iiop.ConnectionTable(Thread[main,5,main]): Exception java.lang.RuntimeException: Connection refused: connect while creating socket for new connection: aborting connection
    com.sun.corba.ee.internal.iiop.ConnectionTable(Thread[main,5,main]): DeleteConn called: host = localhost port = 1050
    com.sun.corba.ee.internal.iiop.ConnectionTable(Thread[main,5,main]): Client get called: host = localhost port = 1050
很奇怪吧!这里出现了localhost。从直觉来说,我们明明在代码中写了调用远程的EJB,应该根本没有localhost什么事。事实就是这样奇怪,调用的时候居然先走localhost,这也就是为什么如果本机起的一个J2EE RI,我们就可以看到来自远方的问候。
就在我疑惑不知该如何走下一步时,无意之举给了我新的方向。
我翻起了J2EE RI配套的文档。没错,之前我一直在自行探索。
在J2EE SDK Tools的文档中,runclient的讲解中有一个小节,其标题是《Accessing a Remote Server》,显然这对我是个极大的触动。
其中提到了一个属性“org.omg.CORBA.ORBInitialHost”。
设置这个属性就可以访问远程EJB???
还等什么?
我们知道在Java运行时以-D定义一个属性同直接在代码中使用System.setProperty具有相同的功效,于是代码中出现了这样一段:
System.setProperty("org.omg.CORBA.ORBInitialHost", "xxx.xxx.xxx.xxx");
运行,祈祷!
来自远方的问候终于出现在我的面前,那种激动相信是程序员无数次经历却依然愿意体味的感觉。我愿意把这种感觉与吸毒等同起来,完全是一种瘾,这是这种瘾让我愿意迎接一次又一次的挑战,克服一个又一个的困难。

“众里寻她千百度,蓦然回首,那人却在灯火阑珊处”
应该说我的习惯并不好,在我自己绞尽脑汁独自摸索时,在我挥动google四处搜寻时,我居然没有想过自己的身边已经有了最好的答案。
以此为戒,以后解决问题时,先要了解配套文档中有哪些内容。

恶斗EJB(五)

SUN工程师的回复中,我得到了另外一个有用的信息,在SUN ONE Application Server的安装目录下的samples/rmi-iiop/simple有一个完整的普通应用调用EJB的例子...
  • zlsunnan
  • zlsunnan
  • 2004年10月11日 11:53
  • 1180

恶斗EJB(一)

虽然近来EJB 3.0已经吵得沸沸扬扬,但作为EJB 3.0根基的JDK 1.5还不知道什么时候正式发布,享受EJB 3.0带来的便利指不定是在什么时候,眼下我们拥有的还只是麻烦的EJB 2.0。终于...
  • zlsunnan
  • zlsunnan
  • 2004年10月11日 11:48
  • 1468

恶斗EJB(三)

一切都结束了吗?别急,刚到再接再厉的好时候,难道你不觉得有了IP,再有个端口就更好了吗?遗憾的是,文档没有给我们答案。以前面的结果为契机,我们继续向前。端口常与IP齐舞,那我们就从“org.omg.C...
  • zlsunnan
  • zlsunnan
  • 2004年10月11日 11:52
  • 1686

恶斗EJB(四)

我最不愿意见到的事情发生了,这场恶斗有了续集。我们的应用实际运行在SUN ONE Application Server上。原本以为在J2EE RI上搞定一切的我可以顺利地把这些东西过渡到我的目标平台。...
  • zlsunnan
  • zlsunnan
  • 2004年10月11日 11:53
  • 1572

聊聊单元测试(二)——MockEJB

Enterprise JavaBean (EJB)是J2EE应用程序中的重要构件块,它为开发人员提供了一个支持服务定义、事件驱动处理和对象-关系持久性的标准框架。但是,使用EJB的开发 人员经常抱怨,...
  • shan9liang
  • shan9liang
  • 2014年07月14日 11:10
  • 2131

EJB的优势和使用场景

EJB的优势和使用场景 即使在EJB 2.0备受诟病的时期,笔者也从不掩饰自己对EJB的喜爱,因为它确实体现了一种非常优秀的设计思想和理念。即使在EJB饱受争议的时期,笔者也一直希望大家用更理智的眼...
  • li_xiao_ming
  • li_xiao_ming
  • 2016年10月12日 08:32
  • 8971

【EJB基础】开发一个简单的EJB应用程序

为了能开发一个简单的EJB应用程序,配置Jboss就快配置了一星期,都快哭了。终于成功了。接下来总结一下开发EJB应用程序的步骤。 第一步,在myEclipse中配置JBoss。 我刚开始下了个J...
  • u010539352
  • u010539352
  • 2016年03月11日 20:15
  • 1969

javabean与EJB的使用方法

javabean访问EJB的方法: 1.定位本地接口:为定位特定的本地对象,客户需要使用JNDI ①Context ic = new InitialContext(); InitialConte...
  • zlb824
  • zlb824
  • 2011年12月09日 16:33
  • 1025

【EJB系列】(六)——EJB的事务管理

EJB的事务管理建立在JTA事务基础之上,应用服务器(如:JBOSS)会负责处理事务管理的底层细节,而EJB开发者只要决定事务边界即可。下面将从特性,隔离级别,传播特性来总结有关事务的内容。 特性 ...
  • u010924834
  • u010924834
  • 2016年04月17日 17:28
  • 829

今天在Eclipse中建立Servlet中调用EJB成功!

昨天看了网上的关于在Eclipse中建立EJB的文章,收获很大.自己也照猫画虎的写了一个,居然能够运行.但只是在命令行下运行的.后来想在servlet里调用,总也没有成功.今天又看了一篇关于在Ecli...
  • jiayp004
  • jiayp004
  • 2004年08月13日 09:59
  • 1240
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:恶斗EJB(二)
举报原因:
原因补充:

(最多只允许输入30个字)