基于J2EE与Java Web Start的文件代理传系统
2009-01-15
作者:高 龙
引 言
传统的企业级应用面临着很多的局限:以局域网为中心,伸缩性差;业务与数据在客户端,不仅加重了客户端系统要求,而且难于管理大量的客户机;难于管理系统中大量的应用软件等。鉴于J2EE是企业级应用上的理想平台,和J2EE与Java Web Start在瘦客户端技术上的强大优势,为此提出了基于J2EE与Java Web Start的企业级应用方案。
基于J2EE与Java Web Start的企业级应用方案
1.体系结构
2.该方案在企业级应用的特点
(1) 由于采用多层结构和Java Web Start这两种瘦客户端技术,不仅解决了在企业级的局域网中部署软件的问题,同时减少了客户端系统及硬件需求,还降低了系统软件成本。
(2) 主要业务和数据处理均在服务器端进行,这样对网络要求不高,且稳定性好。
(3) 来自Java技术的特点,该系统具有高度的通用性和跨平台的特性。
(4) 整个系统的安全性高,功能强大,效率高。因为用Java Web Start部署软件,该软件至少有本系统部署单位的软件签名,方可部署;Java Web Start不仅是瘦客户端技术,而且是富客户端技术(客户端的处理功能强大);并且能及时的更新或升级该软件等。
3.由于Java Web Start只能用于Java应用程序的Jar文件,对与其它类型的软件不容易部署,特别是一些应用软件,而这些软件是市场的主流。虽然能通过编写相关一些Java 类,并用Jar来对这些软件和这些类进行打包来实现,但这样做仅仅起到一个安装发布的作用,
其它的都不易实现。这是该方案的主要缺陷。但是凭着人们对Java技术的信心,特别是一些大公司在Java技术上大量投入,不仅Java Web Start技术会有新发展(例如:对其它软件的兼容性),而且会有大量用Java技术编写的应用软件出现。
4.现在企业及事业单位的信息化是大势所趋,而且相当多的企业及事业单位的信息化的工作做的很积极,有的不可避免与外部进行大量文件的来往,其中内部与外部网络流量(所用的带宽)的大小,内部信息的安全性等是重点关心的问题。鉴于J2EE与Java Web Start的企业级应用方案的优势,采用文件代理传输的方式,设计并实现文件代理传输的系统,以期解决上述问题。
需求分析和系统设计
对于有大量文件传输的企业级系统,其网络流量(带宽)大小,内部信息的安全性等是企业级系统构架是首要考虑的问题。本文件代理传输系统就是基于这些问题所设计的,本系统所实现的功能:1)基于HTTP的代理下载,基于FTP的上传与下载.2)对每一个系统内部成员或部门都有信息管理,包括用户信息,代理信息等.3)有完整的日志信息,能及时地反馈准确的系统安全信息.4)管理员在运行管理端对各种文件代理传输的行为进行确认,根据内部的安全性的原则,进而确定为其进行文件代理传输,这样就有效的把意外的文件传输带来危害扼杀在最初阶段,5)实现对外部Internet的访问与内部成员或部门高峰访问Internet是异步的,这样不仅节约带宽,而且最大限度利用了带宽.系统图如下:
系统的功能与流程的设计与实现:用户通过发送有关登陆信息和代理信息(给一个URL请求下载资料,或给用户名和密码,及ftp地址其请求代理下载与上传)的表单,经过web层和业务层处理后,把正确的信息存入信息DB(数据库)中,再运行管理端确认,并选择内部网对Internet访问流量较少的时候,启动代理组件取得代理信息,建立与外部Internet的连接,并对文件服务器进行访问(代理上传,把相关目录下文件上传,代理下载,则把下载的文件存入相关的目录下).用户则是通过ftp工具与ftp服务器进行文件传输(代理传输的文件存在文件服务器上).
该系统是按J2EE和Java Web Start的企业级应用方案来设计的,其中客户端的用Java写FTP工具和运行管理端的对代理信息进行确认和激活远程代理传输的Java应用程序都部署在服务器端,客户端和运行管理端通过Java Web Start所拥有的JNLP协议从服务器端下载(当然还可以用其他的FTP工具,但这违反瘦客户端的原则);采用J2EE的多层体系结构的设计方案来设计与客户端进行交互的服务器端程序;这样不仅完全实现了瘦客户端,而且整个系统具有可维护性和伸缩性,甚至完全可以把该系统嵌入到一个J2EE的系统中,成为其中的一个服务器端构件.
相关技术及其特点
1.Java Web Start技术在服务器端的使用.
Java Web Start是一种面向Web的应用程序部署解决方案,使用该技术的优点:1)高度交互的用户界面.2)较低的带宽需求,因为它缓存已经下载的信息.3)支持脱机工作.4)在编写基于Java Web Start的程序是还可使用或扩展JNLP API,以增强程序的功能.5)在企业级应用中可减少软件的使用和升级成本等.Java Web Start的通信协议:JNLP(Java网络加载协议),当服务器接受客户端的application/x-java-jnlp的MINE格式的请求, 会使用之前所定义的相关文件类型(jnlp)的应用程序执行,JNLP描述的文件内容为统一标准的XML文件,本系统所用到一个JNLP文件(ftp.jnlp)的相关代码如下:
2.EJB的设计与实现
EJB可用来封装应用程序的业务逻辑,是J2EE平台下的企业级应用的重要部分。通常一个EJB是由Home接口、remote接口和Bean类,以及辅助类组成。Remote接口定义EJB组件中提供的可供用户调用的方法,及实现商业逻辑的函数或过程;Home接口定义Bean生命周期的有关方法; EJBObject为网络可视对象,包含Stub和Skeleton作为Bean的代理。这样的结构使得访问远程对象就像访问本地对象一样,保证企业级应用。在本系统中,出于在业务处理中的数据访问的需要,同时考虑到数据的持久性,分别设计和实现了一个会话Bean和一个实体Bean.
(1)由于EJB中的远程访问的方法要求方法的参数和返回结果是可串行化的类,及实现应用程序的某些功能的方法的需要.设计两个可串行化类(即实现Serializable接口):PersonInfo类包含对应于PersonList表中部分字段信息和AgentList表中overORnot字段信息的数据成员;AgentInfo类的数据成员与数据库中的AgentList表的表头字段之间建立映射关系,并包含配对的getter和setter方法等。
(2)对于类中每个数据成员用getter和setter来访问,其访问开销和复杂过程等就应该考虑,为此采用数值对象把所有的数据封装起来,然后一次发送所有数据,最后通过数值对象把数据一次性存回数据库.下面就是本系统采用这种方法的具体实现过程:
对于无状态会话Bean:创建一个数据存放类InfoList,使用一个Vector类型的数据成员和一个setInfo方法,再创建数据访问类Info来封装对数据库的访问,并把数据填充到InfoList中.关键代码:public class Info{…
Vector ns=new Vector();InfoList inL=new InfoList();rs=sts.excuteQuery(sql);
while(rs.next()){ PersonInfo p=new PersonInfo();
p.setName(rs.getString("name"));… ins.add(p);} inL.setInfo(ins);…}
对于实体的Bean:采用与上面相同的方法创建于实现数据存放类AgentList,数据访问类Agent.
(3)无状态会话Bean-处理用户对用户信息的访问
通过远程接口说明该EJB的功能: import javax.ejb.EJBObject; import java.rmi.RemoteException;
public interface PersonMessage extends EJBObject{
public PersonInfo getMessage(String name, String code); // 返回用户信息
public boolean addHttpMessage(String name, String code, String url);
// 增加http代理下载信息
public boolean addFtpMessage(String name, String code, String ftpUrl, String Ftpname, String code, boolean ul); // 增加ftp上传、或下载信息
…… }
(4)实体Bean-实现对代理信息的管理
通过远程接口说明该EJB的功能: import javax.ejb.EJBObject; import java.rmi.RemoteException;
public interface AgentMessage extends EJBObject{
public int getAgentLength(); //获取代理信息的数目
public AgentInfo getAgentMessage(int Index); // 取得第index+1条代理信息
public void setOver(boolean bl) // 反馈代理(bl=true,成功;bl=false ,失败
…… }
3.采用可激活的RMI的实现对代理JavaBean的控制
考虑到运行客户端和文件代理JavaBean都是Java应用,RMI在两端的复杂程度和类加载的垃圾收集上优于CORBA,故选择RMI. Java RMI支持存储在不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝调用。为了保证分布式系统的高效性,通常在服务器上的对象是激活的,可供客户端随时调用,但一直处于激活状态要占用大量的系统资源,特别对于一些异步的对象,简直是浪费系统资源。本系统中的代理JavaBean就是一个与普通用户访问异步的程序级的对象,因此采用RMI远程方法调用激活系统守护进程来解决这个问题.它的机制是在程序运行后就处于睡眠状态,等待随时激活.这样就解决了RMI的JavaBean生成的开销的问题.它包含可激活的远程接口,接口实现类,注册可激活远程队对象.下面是使RMI远程接口的实现类:
public class activatableRMIImpl extends Activatable implements activatableRMI
{ ……
}
4.相关的数据库技术
由于本系统采用的是JDBC3.0的标准,JDBC3.0新引入了DataSource 类和RowSet接口。使用DataSource对象,使得连接缓存更简单。因为它向程序隐藏了管理连接池的代码(不用自己写代码实现连接池),是连接池管理自动化。另外还支持简单事务:事务提交与回滚。下面是相关的代码:
Context ctx = new InitialContext(); //从JNDI中获取initialContext的句柄
DataSource ds = (DataSource) ctx.lookup("");//引用数据源
Connection conn = ds.getConnection();//建立数据对象连接
try{ conn.setAutoCommit(false);…. conn.commit(); //确定提交
}catch(SQLException e){try{ conn.rollback();… //提交不成功,就回退RowSet是增加了JavaBean接口ResultSet扩展,其中JDBCRowSet是RowSet的实现方式之一,JDBCRowSet最适合创建使用SWING/AWT和其它的JavaBean组件的应用程序,它潜在地允许创建活动的数据视图,还可及时地更新视图。本系统中在运行管理端对代理信息确认,该应用程序就采用通过JDBC直接访问数据源,用OracleJDBCRowset类来创建活动的数据视图。
结束语
基于J2EE与Java Web Start的企业级应用方案是在企业级应用中的一个相当不错的选择,不仅J2EE已成为众多企业平台架构的标准,而且Java Web Start在企业级部署软件和客户端的本地处理能力上有相当大的优势,另外采用该方案的系统成本不高.基于J2EE与Java Web Start的文件代理传输系统是对该方案的一个尝试,本系统目前只是实现整个文件代理传输的基本方案,在整个系统功能方面,特别代理文件传输的JavaBean功能有待进一步完善。最后由于本系统具有伸缩性、高效性、安全性等,对于采用Java平台,又有大量文件传输需求的企业级系统,本系统具有不错的应用价值。
参考文献:
1.David J. Gallardo著 董庆霞译《Java Oracle数据库开发指南》清华大学出版社
2.黄嘉辉编著 《Java网络程序设计》 清华大学出版社
3.尤晋元等《基于JNLP协议的软件上下载服务器的设计与实现》《计算机应用与软件》P5 2003/7
4.http://java.sun.com/