快捷搜索:

把业务流程从操作中剥离出来

在操作层和谐java办事简介

择要

迄今为止,web利用法度榜样开拓的焦点在于将营业逻辑封装成办事。在这篇文章中,Masayuki Otoshi建议将营业流程也剥离出来,就像那些营业历程治理/事情流产品一样,利用基于XML的文档来描述营业。然则这里他深入到了更低的粒度-操作。这篇文章同时展示了可承袭的XML若何允许开拓职员利用面向工具的观点去有效的表示流程。

在开拓web利用法度榜样的历程中,我们常常看到营业流程和逻辑在action中一路被实现,比如JSF中的后台bean和Struts中的action类。在现有框架的赞助下,比如EJB和Spring,我们能把营业逻辑剥离出来,然则营业流程始终照样嵌入在详细操作中。

BPM(营业流程治理)标准,比如BPMN(营业流程建模符号)和BPEL(营业流程履行说话),供给了一种分离营业流程的道路,那便是利用基于XML文档来描述这种分离。这种措施的别的一个好处可以在SOA(面向办事架构)根基上设计利用法度榜样。然则,这种措施使得在web利用法度榜样不能很好地利用action.actoin的粒度对付BPM/事情流产品来讲太低了。他们平日专注于更高的营业范围,如B2B利用法度榜样和企业级的利用整合,而且他们假定营业阐发职员会按照图1所示的措施来描述流程。然则在更低的粒度上,比如action,流程再用的可能性更大年夜。

图1. 粒度对照

在这篇文章中,对付对照小的营业需求范畴,我建议java开拓职员应用J-SOFA(Java Services Orchestration for Actions, Action级JAVA办事和谐)。J-SOFA是一种和谐办事的框架,这里的办事对应于类中的一个措施,无论是POJO(简单清洁Java工具)或者web办事。

因为粒度不合,J-SOFA并不支持消息,状态治理,监控等等的同步。然则不用担心,今朝的BPM/事情流产品都支持这些功能,我们可以直接利用这些产品。这篇文章所讲到的办事和谐框架主要关注于供给营业流程的可用性,就像办事那样。

图2阐清楚明了剥离的营业流程可以被其他利用法度榜样重复使用。

图 2. 可重用的营业流程及办事

版权声明:任何得到Matrix授权的网站,转载时请务必保留以下作者信息和链接

作者:Masayuki Otoshi ;rainh95(作者的blog:http://blog.matrix.org.cn/page/rainh95)

原文:http://www.javaworld.com/javaworld/jw-04-2006/jw-0417-sofa.html?lsrc=jwrss

Matrix:http://www.matrix.org.cn/resource/article/44/44500_Business+Services.html

关键字:Business;Services

JSF中的简单action

让我们来看看用JSF开拓的web利用法度榜样中的一些简单action的代码。我们的例子是一个简单的模型搜索法度榜样:根据用户输入的模型ID返回模型详细信息。

你可以从这个资本下载这个示例的源代码。

在搜索jsp页面上,有一个文本框和一个submit按钮,用户可以输入model id然后提交。这个jsp页面经由过程一个叫ModelBean的后台bean调用showModel()措施。如列表1所示:

列表 1. search.jsp中的inputText及Submit按钮

为了孕育发生模型详细信息页面(搜索结果页面),showModel()措施创建Model工具和特性表,再赋值到属性傍边

列表 2. 在backing bean中的showModel()措施

public String showModel() {

if (modelId > 0) {

ModelService modelService = new ModelService();

BeanUtils.copyProperties(this, modelService.create(modelId));

setFeatures(modelService.getFeatures(modelId));

}

...

}

高档开拓职员可以像上面展示的代码一样将营业逻辑从详细操作平分离出来,经由过程一个model的service实现创建model和features,再经由过程interface来调用它。不管如何,假如其他人来掩护后台bean,我们还能维持这个措施这样简单吗?这样做可能被证实异常艰苦,由于不是所有的开拓职员都明白隔离展现层和营业层的好处。假如一个持有不合不雅点的开拓职员开拓掩护后台bean,她/他可能会将营业逻辑加入到showModel()中去。在项目中,这种状况是很寻常的,由于法度榜样设计说话,比如这个例子顶用到的java,允许我们用它强大年夜的体现能力去实现任何营业逻辑。是以,我们应该用别的一种说话去实现营业流程,而不是java。

从一个框架的角度来看,预防开拓职员沉湎于将流程和逻辑放在一路是异常紧张的。描述营业流程的说话可能难于实现逻辑,但与此同时,却能像编程说话一样富有体现力。今朝,必要利用BPM/事情流的观点去增添框架的办理规划。对付这个问题,我建议用XML-based文档(法度榜样定义XML)去描述流程,它可以指定必要按照什么顺序调用哪些service。从而,利用了J-SOFA之后, showModel()措施中的流程可以像下面这样表示:

列表 3. process.xml

0}">

在上面的XML中,modelService的两个操作经由过程service标签被调用,service标签对应于service组件中所实现的措施。他们也可以被利用于前提或轮回语句中,如if,choose,forEach等。然而,他们照样不如编程说话富于体现力。别的,J-SOFA并不能履行从service标签中得到的模型和特点工具的措施,除非是经由过程getter措施。这些限定前提要求开拓职员用XML描述营业逻辑时具备加倍繁杂的常识才气,不管如何,它们照样能赞助开拓职员抉择哪些营业逻辑应该用service类实现。有这些service要领实现的营业逻辑,我们可以开拓基于SOA的利用法度榜样,更能快速适应各类各样营业模型的变更。

范例的web利用法度榜样框架不支持办事和谐,如JSF和Struts。以是,我们必须在showModel()措施中编写下面的代码去履行处置惩罚:

列表 4. 调用流程的showModel()措施

public String showModel() {

ProcessInstance process = new ProcessInstance("process.xml");

ProcessContext context = new ProcessContext();

context.put("modelId", modelId);

process.execute(context);

BeanUtils.copyProperties(this, context.get("model"));

setFeatures((List) context.get("features"));

...

}

无论若何,假如框架拥有支持调用场置惩罚的功能,我们不必要创建action。相反,我们必要:

--创建流程定义XML

--创建用于在处置惩罚中被调用的service组件

--在JSP页面编写显示处置惩罚返回值的代码

在这部分,我说清楚明了流程定义XML若作甚action定义流程;无论若何,此中的有些定义可以在真实天下中被重用。鄙人一节中,我将用别的一个例子去阐明若何再使用流程。

可承袭的XML

创建流程的时刻,我们发明有些流可以被其他的流程共享。举个例子,我创建了4个页面,如下图3所示:模型总览,模型特点,和其他两种分类索引页面。所有的页面包孕相同的标题和页脚。前两个模型页面用同一个Model工具来显示模型信息,如模型名称。后两个分类页面同样那个也是用一个Category工具。着末,每个页面有自己零丁的页面处置惩罚进程。

图3. 流程中的共享流

在这个案例中,每个流,如模型特点,能用subProcess标签标识,它能履行别的一个叫做“sub-process”的流程。

列表 5. modelFeatures.xml调用sub-processes

(留意:在这个和后面的清单中,为了简化代码,service标签中的子标签将被省略)

---------- (1)

---------- (2)

----- (3)

页面和模型流程暗藏在每个sub-process中,然则我们仍旧能找到从(1) 到 (3)的继续流。以是,假如我们要改动流,比如改变流的顺序为(2), (3), (1),那么在别的的流程中,也不得不做这种改变。

为了办理这个问题,J-SOFA支持一种基于承袭的办理措施。基础的思路是供给这样一种机制:允许导出一个根基历程中的标签,然后再重写它。

我们可以在process标签顶用extends属性创建一个导出历程。在这个例子中,历程的层次布局能用如图4表示:

图 4. 流程等级图

Header和footer在根基历程中定义,model和Category在导出历程中定义,导出历程从根基历程中承袭了header和footer标签。每一个代表一个特定的页面的历程,可以当作是model或category历程的扩展。

在page.xml中,我们孕育发生一个header和footer,可是,我们并不知道到底在这个页面中会显示什么内容(模型或者分类?)在此刻,abstract标签会被导出流程中的其他标签重写,可以按如下要领利用:

列表 6. page.xml (根基流程)

在列表7中,model.xml可以当作是从page.xml获得的,以是,page.xml被列入process标签的extends属性中。在这个XML块中,我们只必要描述必要重写的标签。在这个案例中,model.xml中的group标签重写了abstract标签,它在page.xml中有着相同的id ”contents”.

在这个时刻,我们知道必须创建Model工具,可是我们不知道究竟哪个页面会调用这个历程。是以,我们不创建一个详细的历程,而是用abstract标签表示特定页面的内容:

列表 7. model.xml (承袭流程)

如列表8所示,详细页面内容在从model.xml承袭的modelFeatures.xml中描述。除了特点表之外所有我们必要创建的办事,都已经在根基历程中定义,以是我们只必要重写abstract标签,用service标签调用getFeature()操作。这样,开拓职员可以将焦点放在跟特定页面相关的处置惩罚上。

列表 8. modelFeatures.xml (详细流程)

当历程实例被实例化时,page.xml,model.xml和modelFeatures.xml这三个XML文档在履行之前被创建,如下面列表9所标示的那样:

列表 9. Model Features的复合流程

利用XML承袭措施,开拓职员能够重用在根基历程中表述的事情流。开拓职员同样可以供给定义通用流的抽象历程,给其他开拓职员描述特定页面的历程。

结论

用XML-based文档描述事情流这个观点已经在BPM和事情流产品中实施。不管如何,到今朝为止,它主要用于高层次营业描述中。在本文中,我们看到,这个观点同样适用于web利用法度榜样中的action。

办事和谐框架将直接赞助开拓职员抉择哪些流应该用历程XML描述,哪些逻辑利用用service实现。结果是,利用法度榜样会基于SOA设计和开拓,重用性会变得越来越好。

关于作者

Masayuki Otoshi 是一个家公司的开拓Web利用的高档法度榜样员。他还认真这家公司的利用框架的设计与开拓。

您可能还会对下面的文章感兴趣: