Tuscany与JBoss集成中遇到的问题及排除
From Tuscany中文社区
Tuscany与JBoss有多种集成方法,我们选择了通过一个Spring的InitializingBean在Spring启动的时候初始化Tuscany,并将其保持在一个static变量中,即全局唯一。
但是我们遇到了一个问题:就是Tuscany使用了java.net.URL对象的openStream()方法,当URL指向一个文件目录的时候,该方法将会返回文件列表。而在JBoss环境下,该方法却不能正常工作,反而抛出了IOException。
我们在互联网上搜索相关的资料,却没有找到答案,在JBoss社区请教解决方案也没有回音。
经过数日的研究,我们发现了问题的出处:
原来,java.net.URL的处理是可扩展的,通过用户按照package名称的最后一位,如com.sitechasia.webx.protocol.aaa,我们就可以自行实现叫做aaa:的协议。在这个package下,我们必须至少实现一个java.net.URLStreamHandler,并且实现类的名字必须是Handler,即com.sitechaisa.webx.protocol.aaa.Handler。 在运行时,还要指定系统属性java.protocol.handler.pkgs 即:-Djava.protocol.handler.pkgs=com.sitechasia.webx.protocol, 这样,用户便能够通过URL对象处理aaa://这样的协议了,否则,在通常情况下,aaa://这样的协议会导致异常。
在却生条件下,当我们试图处理file://协议的时候,实际执行Handler的对象是sun.net.www.protocol.file.Hander,该类位于rt.jar,而在JBoss运行时中,这个对象被org.jboss.net.protocol.file.Handler取代。 我们试图通过系统属性将处理file://的Handler重定位到sun的或者我们自己的Handler,但是没有作用。
(但是如果我们创建新的协议如webx://,则可以利用自定义的Handler正常工作,但是不幸的是,Tuscany里面还会使用java.io.File的一个构造器new File(URI)来处理我们给定的URL,所以使用自定义的协议还不能充分支持Tuscany)
最后,我们使用了一个不太规矩的方法,就是使用了与JBoss相同的package名称。即将我们的Handler命名为org.jboss.net.protocol.file.Handler,并将它放在jboss的classpath中,比较靠前的位置。 类图如下:
图中:我们创建的org.jboss.net.protocol.file.Handler简单地继承了sun.net.www.protocol.file.Handler,而并未重载任何方法。
然后,我们将这个类打包为jar。
然后,我们在JBoss的启动脚本run.sh中将这个jar添加到classpath。
现在,Tuscany已经可以在JBoss中正常工作了。


