您的位置:首页 > 其它

数据和服务 – 通向企业服务总线(ESB)之路

2009-01-30 11:13 405 查看
在前面的章节中,我们已经学习了XML的基础知识以及基于XML的Web服务。现在,我们就可以从企业级的视角,看看这些是如何组装起来。对企业用户来说,信息及信息的基本构成元素—数据是他们所感兴趣的。数据可以驻留在任何数据存储中心,并以各种形式存在。如果不考虑数据存储和格式,您需要将数据存到表中,并应用企业业务逻辑对它们进行处理,然后它们才能变为信息提供给用户。那么,在SOA世界,我们怎样才能从传统的JDBC或ORM(Object-relations mapping, 数据关系映射)中解脱出来?而且,更加另我们感兴趣的是,数据甚至可以以服务的形式存在,如果是这样,我们怎样将多个服务组合起来,并对它们进行查询,就象我们将多个JDBC查询结果组合起来那样?在本章中,我们将看一下这些问题,本章主要内容有:
JDO作为替代JDBC的可选方案;
数据服务及其在SOA中的角色;
即将出现的数据服务标准,例如SCA和SDO;
对Apache Tuscany进行介绍;
介绍MOM(message-oriented middleware,消息中间件);
企业服务总线ESB(Enterprise Service Bus)—一种全新的架构体系
介绍OpenESB
JDO简介
您对JDBC及ORM框架(如Hibernate和Toplink)已驾轻就熟,但现在我们却要介绍Java另外一种数据访问形式 – JDO(Java Data Object,Java数据对象),它是一种标准实现,它使用标准的基于接口的持久化抽象模型,对数据源进行访问。最初的JDO规范(JDO1.0)相当有年头了,它基于JSR12(Java Specification 12)规范,是在Sun公司的领导下制定的。JDO现在的版本为JDO2.0,它实现了JSR243规范。从JDO2.0开始,其API的开发和参考实现都交由Apache开源社区完成,JDO也演变为Apache的一个开源项目。
为什么要使用JDO?
我们都有使用JDBC从关系数据库中提取数据的编程经验。但现在的问题是,我们是否需要另一种标准 – JDO来访问数据?作为一名软件开发者,如果您认为您需要对您的业务问题提供解决方案,您会从业务用例开始(business use cases),分析业务逻辑,最后得到业务域对象模型(BDOM,Business Domain Object Model),这样做是很明智的。因为业务域对象模型(BDOM)将会指导您对实体类进行设计,这些实体类将被持久化,因此,它们可以用来存储数据;一旦您完成实体类及它们之间的关系的设计,接下来的问题是,您是否应该编写代码创建表,并持久化数据或查询表(在没有数据表的情况下,可以是其它种类的数据源)中的数据?我对这个的问题的答案是“否”。因为您写的代码越多,您出错的几率就越大;再者,开发人员的时间是宝贵的;而且,技术也在不断更新,今天您也许使用JDBC实现上面所提的“技术性功能”,明天您也许想把关系数据库中的数据迁移到另一种数据存储中,这时,您就会修改您所有的JDBC代码,以适合新的标准。在这种情况下,JDO就可以派上用场了。下面我们先来小结一下JDO不同于其它类似框架的特色:
分离关注点:使用JDO,应用开发者可以专注于业务领域对象模型(BDOM),而将那些数据持久化的细节(如数据的存储及提取)留给JDO;
JDO是基于接口的:JDO是一种基于Java接口的编程模型,因此,所有的持久化行为,如ORM框架中的一些最常用的功能,是以元数据(metadata)的形式存在,元数据独立于您的BDOM源代码;另外,您也可以以即插即用(Plug and Play, PNP)的方式使用多种JDO实现。
数据存储方式的可移动性:持久化存储方式不管是关系型的,还是基于对象,或者只是一个XML数据库或扁平文件,JDO的实现都能支持它们。因此,基于JDO的应用是独立于底层数据库的。
性能:JDO知道如何更好地同数据存储中心进行交互,同开发者编写的代码相比,这可以提高数据访问的性能。
和J2EE的集成:JDO应用可以利用J2EE的一些特点,如EJB及远程消息处理、自动分布式交易的协作、安全等这些J2EE企业级特色。
JPOX—Java持久化对象
JPOX是Apache的一个开源项目,它使用JDO,为Java访问异种数据源提供了一种解决方案。我们这里指的JPOX JDO支持的异种数据源,主要包括下列持久化方案四个主要方面特色的各种组合: 持久化定义:它定义了如何将您的BDOM类持久化到数据存储中;
持久化API:用来持久化您的BDOM对象的API编程接口;
查询语言:按照特定的条件来查找对象的一种语言;
数据存储:储存您的对象的底层数据保存中心。
您可以从http://www.jpox.org/处下载JPOX JDO。
使用JPOX的JDO示例
在本例中,我们将使用我们熟悉的订单(Order)和商品(LineItems),将它们扩展到JDO实现。假定您已下载并把JPOX库解压到您的本地硬盘。
本例中的BDOM(业务域对象模型)
为方便讨论,我们这里只考虑两个实体类,即OrderList(订单列表)和LineItem(单个商品),这两个类的属性及它们的关系如下图所示:



上面的BDOM表明,一个订单可以包含多个商品,而一个商品属于且仅属于一个订单。

JDO中的BDOM实体类源代码
BDOM中的实体类非常简单,只为每个属性提供了getter和setter方法。接下来,这些类需要通过JDO的配置文件连接到JDO,从而可以利用JDO的持久化的能力,但这些完全独立于核心的实体类。
OrderList.java
OrderList类代表订单(Order),它有一个主键属性number:
public class OrderList{
private int number;
private Date orderDate;
private Set lineItems;
// other getter & setter methods go here
// Inner class for composite PK
public static class Oid implements Serializable{
public int number;
public Oid(){
}
public Oid(int param){
this.number = param;
}
public String toString(){
return String.valueOf(number);
}
public int hashCode(){
return number;
}
public boolean equals(Object other){
if (other != null && (other instanceof Oid)){
Oid k = (Oid)other;
return k.number == this.number;
}
return false;
}
}
}
LineItem.java
LineItem代表订单中包含的每个商品,虽然JDO中可以为LineItem定义主键,但这里我们并没有为它显示地定义主键。
public class LineItem{
private String productId;
private int numberOfItems;
private OrderList orderList;
// other getter & setter methods go here
}
package.jdo
JDO需要一个XML配置文件,来定义要持久化的数据列,以及这些列使用何种JDBC或JDO进行封装映射。为此,我们可以创建一个名为package.jdo的XML文件,其内容如下,并把它放到和JDO实体类相同的目录中。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jdo SYSTEM "file:/javax/jdo/jdo.dtd">
<jdo>
<package name="com.binildas.jdo.jpox.order">
<class name="OrderList" identity-type="application"
objectid-class="OrderList$Oid" table="ORDERLIST">
<field name="number" primary-key="true">
<column name="ORDERLIST_ID"/>
</field>
<field name="orderDate">
<column name="ORDER_DATE"/>
</field>
<field name="lineItems" persistence-modifier="persistent"
mapped-by="orderList">
<collection element-type="LineItem">
</collection>
</field>
</class>
<class name="LineItem" table="LINEITEM">
<field name="productId">
<column name="PRODUCT_ID"/>
</field>
<field name="numberOfItems">
<column name="NUMBER_OF_ITEMS"/>
</field>
<field name="orderList" persistence-modifier="persistent">
<column name="LINEITEM_ORDERLIST_ID"/>
</field>
</class>
</package>
</jdo>
jpox.PROPERTIES
本例中,我们将把我们的实体类持久化到关系数据库Oracle中,我们需要在jpox.PROPERTIES文件中指定主要的数据库连接参数:
javax.jdo.PersistenceManagerFactoryClass=org.jpox.jdo.JDOPersistenceManagerFactory
javax.jdo.option.ConnectionDriverName=oracle.jdbc.driver.OracleDriver
javax.jdo.option.ConnectionURL=jdbc:oracle:thin:@127.0.0.1:1521:orcl
javax.jdo.option.ConnectionUserName=scott
javax.jdo.option.ConnectionPassword=tiger
org.jpox.autoCreateSchema=true
org.jpox.validateTables=false
org.jpox.validateConstraints=false
Main.java
这个类用来测试JDO的功能,其代码如下,它首先创建两个订单(Order)对象,然后为每个订单添加几个商品,然后它持久化这些实体类对象,并通过id属性来查询返回这些实体化对象。
public class Main{
static public void main(String[] args){
Properties props = new Properties();
try{
props.load(new FileInputStream("jpox.properties"));
}
catch (Exception e){
e.printStackTrace();
}
PersistenceManagerFactory pmf =
JDOHelper.getPersistenceManagerFactory(props);
PersistenceManager pm = pmf.getPersistenceManager();
Transaction tx = pm.currentTransaction();
Object id = null;
try{
tx.begin();
LineItem lineItem1 = new LineItem("CD011", 1);
LineItem lineItem2 = new LineItem("CD022", 2);
OrderList orderList = new OrderList(1, new Date());
orderList.getLineItems().add(lineItem1);
orderList.getLineItems().add(lineItem2);
LineItem lineItem3 = new LineItem("CD033", 3);
LineItem lineItem4 = new LineItem("CD044", 4);
OrderList orderList2 = new OrderList(2, new Date());
orderList2.getLineItems().add(lineItem3);
orderList2.getLineItems().add(lineItem4);
pm.makePersistent(orderList);
id = pm.getObjectId(orderList);
System.out.println("Persisted id : "+ id);
pm.makePersistent(orderList2);
id = pm.getObjectId(orderList2);
System.out.println("Persisted id : "+ id);
orderList = (OrderList) pm.getObjectById(id);
System.out.println("Retreived orderList : " + orderList);
tx.commit();
}
catch (Exception e){
e.printStackTrace();
if (tx.isActive()){
tx.rollback();
}
}
finally{
pm.close();
}
}
}
编译并运行JDO实例程序
首先,如果您没有修改过本章下载代码中的examples.PROPERTIES文件,请编辑该文件,将其中的目录路径指向您的开发环境。在您下载的本章代码中,也包含一个README.txt文件,它也说明了编译和运行本例的详细步骤。因为我们使用Oracle来持久化实体类,我们还需要把下面两个库文件加到classpath中:
jpox-rdbms*.jar
classes12.jar
我们还需要其它一些库文件,您可以在build.xml文件中找到它们,请下载这些jar文件,并相应地修改examples.PROPERTIES配置文件中的路径。要编译本例,首先启动您的数据库服务器,然后键入ant命令编译编译它,您可以进到本书源代码的ch04/jdo目录,并执行下面的命令:
cd ch04/jdo
ant
上面的命令将执行下列步骤:
首先,它编译Java源代码;然后JPOX库对每个持久化类的字节码进行增强;
然后,它将在数据库中创建所需的数据库模式(表的定义)。



要执行本例,请执行下面的ant命令:
ant run



您现在可以交叉检查您的实体类是否保存(持久化)到数据库,下图显示了Oracle数据库中的订单及其子元素商品数据。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: