JFox(J2EE应用服务器开源项目)

JFoxNS (JFox命名服务)


(by huihoo.org JFox项目组)

初稿:orbat (young_yy@hotmail.com)

一、JNDI

JNDI 是 J2EE 的最基本的服务,其它的服务都将建立在此服务基础之上,所以JFox的第一步是开发一个己有的JNDI服务。

JNDI 的规范可以参见 附带的jndispi.pdf,这是从 sun 的java网站上下载下来的,我已经加了注释在里面,指出了规范中的一些重点或是编写服务程序时需要注意的地方,给大家一个参考。

二、jnp JNDI server 分析

jnp 是直接通过 Socket 编程 ,使用 serializable 和 MarshalledObject来实现服务的,将存储的对象首先通过 MarshalledObject 封装(串化),然后存储在 NameServer 里面,解析时,会将其解封装(使用 MarshalledObject.get())再返回,MarshalledObject 类的神奇之处在于它会根据 URL 或者 Remote Object 的 stub 自动重新载入封装的类。

另外jnp 也支持 Reference 引用存储,但是只支持 URL 类型的 Reference。(详情请查阅jnp 的代码和 JNDI 规范)

关于JNP 的说明:(以下节选自jnp说明文档。)

(1) Features
o Hierarchical namespace (i.e. supports subcontexts)
o Supports References
o Supports remote access

(2) Comparison with RMI Registry

The JNP is intended to be used as a replacement for the RMI Registry. Here is a brief comparison of key features.

(3) Class availability

The RMI Registry requires you to either use dynamic classloading, or to have the classes (including stub) installed on the registrys classpath

JNP have no requirements on class availability. Since it stores any bound object in a marshalled state the classes only have to be available to the client. If any state in a bound object is made of dynamically loaded classes, the codebase of those classes will be stored, and restored upon lookup.

(4) Usage modes

The RMI Registry can be run externally as a standalone application, or it can be embedded in applications. It does not support graceful shutdowns.

JNP can be run externally through an executable JAR, or it can be embedded as a JavaBean in any application. If used in embedded mode, the application can control the naming server through start/stop commands.

(5) Namespace

The RMI Registry uses a flat namespace.

JNP uses a hierarchical namespace, where you can create subcontexts, and do listings of subcontexts etc.

(6) Access

The RMI Registry allows only local hosts to bind objects.

JNP does not have any restrictions on who may bind what. A single JNP server may serve an entire network.

三、jnp 实现

下面是jnp几个重要的类图:

NamingServer 类:这个类实际上只是一个 jndi Object Map 的操作类,jnp把对Object Map 的操作不是直接放在 Context 实现类中,这样可以保证 Context 类相对比较简单


Main 类是服务启动类,服务启动时,将创建一个 Socket 服务端,用来接收来自客户端的请求,然后进入该 Socket 的 accept() 等待状态;关闭时,直接关闭该 Socket ,服务即终止。

另外还有 NamingContext 类,实现了 Context 接口,该类最后调用 NameServer 进行绑定等操作。

四、JFox JNDI Server 的实现

(一) 与 jnp的比较
1、使用平面存储实现层式名字空间,使名称索引加快;
2、建立在 rmi 结构之上,编码简单易懂;
3、更符合逻辑的类名

(二) 结构说明
吸取jnp将Context与名称操作类分离的结构,但是更进一步的是:此时的 NamingHolderImpl(相当于jnp 的 NamingServer) 和 Server(相当于jnp 的Main)是一个远程对象,可以通过 rmi 直接进行远程访问,不要针对Socket 来编程,大大降低编码和维护的难度。另NamingHolderImpl 只维护一份映射表,所以的名字将以平面的方式来维护,这样,索引时避开了 jnp 的递归搜索,将大大提高索引的速度,但是同时也增加了维护 Context 难度。

五、安装运行JFoxNS

从http://sourceforge.net/projects/jfox/ 下载 jfoxns-1.2.0.zip
解压后运行bin/start-ns.bat
JFoxNS核心启动时状态:


六、JFoxNS javadoc

浏览 JFoxNS javadoc >>>

更详细的文档正在完善中