使用一个简单的webframe来解决EAI和分工合作问题
在前段时间的工作中,我们开发了一个面向最终客户的网站,网站的数据都是来自不同的系统的,这是一个带有EAI性质的项目,包括有:SQL Server数据库、Tuxedo Jolt服务、Tuxedo上运行的Corba服务、Socket。很自然的,会考虑使用EJB来访问这些后台系统,使用Servlet来访问EJB,使用JSP来显示结果。
在设计阶段,我们最头疼的问题是,我们只有两个初级经验的jsp/servlet人员,对j2ee的了解并不深入,同时有两个具有相当经验的j2ee开发人员。如果按照传统的方式,开发EJB,然后公布一个接口给web开发人员,再由web开发人员完成页面,效率很低又没有办法很好的维护。我们也简单考察了一些现有的技术,包括webservice、cocoon、mvc、tag技术等,发现都需要增加相当多的培训时间,所以我们决定做一个自己的webframe,这个webframe目前使用的版本,解决了以下两个重要问题:
² 把Web和EJB(完成EAI接口调用)开发人员的开发工作隔离开
² 可以更容易的与其他系统集成(EAI)
实际上,目前的webframe,实现的功能与webservice有不少相似之处。
完整的与EAI系统交互的工作流程
这个序列图简单描述了使用webframe的情况下,如何与一个EAI后台系统进行交互。
图中的xml message、Servlet和JSP View构成了简单的MVC模型。
Servlet把提交的数据转换为xml数据,webframe负责检查这些数据的合法性,同时判断应该把xml数据提交到哪一个EJB。EJB接收到xml数据后,与后台EAI系统连接,然后把结果也构造成xml数据,返回给webframe。
一般的,xml数据应当描述以下信息:
² 操作的用户,webframe做日志记录用以及判断该用户是否有操作权限用
² 该操作的编号,webframe用来判断对应的EJB JNDI Name用
² 操作的数据,webframe不处理这些数据,而由EJB来处理
² 返回的数据,webframe不处理这些数据,由JSP View来显示给User
可以看到,关键在于数据都是xml格式的,所以,在实现上,webframe和EJB中负责操作的方法,入参和出参都是String类型,也就意味着,所有负责EAI的EJB的Home Interface和Remote Interface是一致的。
webframe中最关键的事务处理类和方法:
package com.sztelecom.webframe.core;
/**
* 核心事务管理,负责前台和EJB会话管理
* @author Chen WenJing
* @version 1.0, Mar-27-2002
* @since JDK 1.3.1
*/
public class TransactionManager
{
/**
* 受理申请,根据xml描述分发到不同的EAI EJB
* 见WebUser.referApply()
* @param _sxml xml描述
* @return xml操作结果
*/
public String referApply(String _sxml)
{
}
}
EJB Home Interface:
package com.sztelecom.webframe.ejb.core;
/**
* 所有EAI EJB Home接口
*
* @author Chen WenJing
* @version 1.0, Mar-27-2002
* @since JDK 1.3.1
*/
public interface AgentHome extends EJBHome
{
Agent create() throws CreateException, EJBException, RemoteException;
}
EJB Remote Interface:
package com.sztelecom.webframe.ejb.core;
/**
* 所有EAI EJB Remote接口
*
* @author Chen WenJing
* @version 1.0, Mar-27-2002
* @since JDK 1.3.1
*/
public interface Agent extends EJBObject
{
/**
* 操作申请方法。
* @param _sxml xml描述
* @return xml操作结果。
*/
public String referApply(String _sxml) throws EJBException, RemoteException;
/**
* 查看EJB是否可用的方法。
* @return true
*/
public boolean isAvailable() throws EJBException, RemoteException;
}
EAI接口开发人员的职责
在使用webframe开发的情况下,EAI接口开发人员只需要完成EAI调用,同时给出xml请求数据和返回数据格式就可以了,更完整的情况下,可以给一个简单的调用例程。不同于传统的J2EE EJB开发,还需要让调用人员来关心Exception、AppServer地址、复杂的参数等问题。
web开发人员的职责
在使用webframe开发的情况下,web开发人员只需要知道xml数据的格式以及该操作的编号,就可以完成。Web开发人员完全不需要知道任何与EJB有关的知识,只需要掌握html、jsp和servlet就可以。
webframe中的关键类说明
核心处理类包括有:
TransactionManager完成事务管理,这个singleton的类负责与EAI EJB连接。
PlugInit接口是用来定义额外的初始化内容的,而实现这个接口的类名将在名为webframe.xml的配置文件中描述。
DBConnection类包装了数据库连接,数据库连接的地址或者是JNDI名在webframe.xml中描述。
EAI EJB的Home及Remote Interface
日志记录的类,Webframe包装了Log4j和Logkit的日志系统,它们都是Apache提供的,Logkit比Log4j提供了更多的定制空间,所以系统日志是Log4j记录的,而访问EAI EJB的应用日志,由Logkit来记录。
webframe初始化用的Servlet,所有配置信息,记录在webframe.xml文件中。
与用户有关的包括有:
WebUser类是一个实体类,记录登录的用户的各种状态和数据。
LoginRole接口是用户角色接口,而具体对应的用户角色类在webframe.xml中描述。
Validator接口是用户认证器接口,用来检查用户合法性,对应的用户认证器类在webframe.xml中描述。
LoginManager类管理用户的整个生存期。
webframe提供的功能列表
ü 完全符合j2ee规范,可以搭建在任何符合j2ee标准的web服务器中
ü 管理基本的数据库连接
ü 完善的日志系统,包括系统日志和EAI日志
ü 管理用户类型,且用户类型可以自定义
ü 负责EAI EJB访问分发,控制访问并发负载
ü 可自定义额外的初始化插件
ü 管理用户类型可用EAI EJB
ü 使用xml完成配置和EAI EJB访问数据
ü 管理用户生存期
ü 统一的用户登录入口
ü 统一的xml业务数据入口和出口
webframe展望
目前的配置文件webframe.xml还需要手工来修改,将提供console来修改配置文件。而目前修改配置文件需要重新启动服务器的情况也会得到解决。
webframe的最终目的是成为一个适应大多数情况的web-EAI系统基础平台,最大程度的减少培训成本,使不同角色的开发人员可以专心在各自的专有领域完成开发工作。