`
snowfox2008
  • 浏览: 127479 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JBPM最佳实践

阅读更多

原文来自:http://www.mastertheboss.com/en/jbpm/106-jbpm-best-practices.html,原创翻译,转载联系本人

 

JBPM最佳实践


没有完美的规则来对你的工作流进行建模,这依赖于你的流程的需求,涉及到的执行者等等。不管如何,我想同你分享一下开发人员通常认可的关键规则。如果你认可或者你想提些建议,请反馈给我。

1) 保持你的JBPM executionContext整洁
在我曾经见过的正式的第一个JBPM项目中,我注意到开发人员有时使用executionContext来放置很多流程的变量。为了控制执行流,向executionContext中增加变量是基本的法则,但是不管如何,不要被它诱惑的往里面放任何东西!例如:假设你正在设计一个复杂的售票系统:你可能需要存储一些关于执行者的附加信息,例如:名,姓,邮件。因此在执行上下文中你混合了既有模型变量和流程变量!
在一个EJB中构造这些字段,并且在你的executionContext中仅保持一个ticketid。下面是一个使用Seam与业务流程进行交互的EJB的例子:

@Stateful  
@Name("TicketingSystem")  
   
public class TicketBean implements TicketBeanItf {  
   
@PersistenceContext(type=PersistenceContextType.EXTENDED)  
EntityManager em;  
   
@In(create = true)  
@Out  
private Ticket ticket;  
   
// We make this available to the business process  
@Out(scope=ScopeType.BUSINESS_PROCESS, required=false)  
long ticketId;  
   
@CreateProcess(definition="TroubleTicketing")  
 public void createTicket() {  
    em.persist(ticket);  
    // Keep a reference to the ticketId in your biz process  
    ticketId = ticket.getTicketId();  
 }  
    
}  

 记住这执行上下文中添加领域变量,除了被当作一个差的设计选择外,而且也会很大程度上降低你流程的性能。
2) 使用异常处理器,仅用来设置变量或者做错误通知
JBPM有一个内建的异常处理器,能够被应用在单一节点或者整个流程。

 

<exception-handler exception-class="java.lang.Exception">  
    <action class="com.sample.handlers.BPMExceptionHandler"></action>        
</exception-handler>  

 
你或许曾经被诱惑在JBPM中使用异常处理机制来决策执行流:不要这样做!JBPM的机制并不完全与java的异常处理相似,在java中,一个捕获的异常能够对控制流产生影响。而在jBPM的案例中,控制流不能被jBPM的异常处理机制改变。异常可以被捕获或不捕获。不捕获的异常被扔给客户端(例如,调用token.signal()方法的客户端)或者这个异常被jBPM异常处理器捕获。对于捕获的异常,graph execution会当作没有异常发生继续执行。
使用异常处理器的最佳实践是,执行那些相关的action(设置变量,发生邮件,jms消息等)然后或者继续graph的执行(你期望的行为)或者因为事务失败而重新扔出异常,并且结束当前节点回到开始的状态。
依赖于被扔出的异常,在你的Action中捕获业务异常并且设置一些流程变量也是一个好的设计。然后你可以在流程中构造一个决策节点,用来选择一个特定的执行路径。

3) 需要JBPM做失败转发?在一个集群的SLSB(无状态session bean)中封装JBPM的调用
jBPM是一个状态机:流程描述和运行时的状态被持久化到数据库中,但是在一个集群环境中,他们不会自动失败转发。如果一个集群节点失败了,这时正在执行的一些外部触发器(ui,jms,重复执行的计时器)需要停止执行并且不得不重新启动。依赖于你所处的事务上下文,这些动作能够被自动执行(重新传递jms消息,重新执行计时器)或者请求UI交互(如果集群节点down机需要重启时,显示错误消息给用户)。
因此,当流程描述是持久化时,工作流的失败转发必须被手动执行。jBPM能够被用来构建一个完整的失败保护,可集群的支持失败转发的工作流解决方案,但是它不支持开箱即用。
那么,在你的工作流中增加这些特性的最简单的方式是什么?对于大多数的案例,最佳的解决方案是在你的应用中用一个无状态的会话bean来封装jBPM API的调用,并且在最后构建集群。
给你的EJB增加集群能力一点也不复杂,参考下面的方案:
http://www.mastertheboss.com/en/jboss-application-server/49-jboss-ejb3-in-a-cluster.html
4) 在尽可能的地方使用superstates
一个Superstate是一组节点:它是一种将节点组合成相关集合的方便的方式,是在流程中实例阶段的表示。例如,一个应用程序能够分阶段组合流程中的所有节点。动作可以被关联到superstate事件上。一个重要的意义就是一个令牌能够在给定的时间上被多层嵌套。这可以方便地来检查一个流程是否被执行了,例如在开始阶段。
 
因此,当每个状态都代表着一个流程的阶段时,将流程拆分为superstates是一种好的设计,但是为什么我提倡对superstates的使用有更多的理由:JBPM是一个状态机并且本身没有交付一个内建的图形化环境。有个实际的Eclipse插件,可以让你来图形化的流程建模,但是它不是在市场上最好的BPM前端工具:图标太大,太丑陋,并且你不能够自己为不同的节点类型(至少它能够马上实现)来定制图标。如果你曾经用JBPM画一个有100个节点的流程,你可能也做我所做的事情了:因为流程的图片很大并且完全杂乱,我从JBPM中自己设计了一个前端展现层。
如果你不希望为JBPM设计一个新的前端,那么尽可能广泛地使用superstates,它将使你的流程(jpg图)更可读并且当你展现一个5页的流程图时你的老板不会晕。
5) 扩展JBPM的Api而不是搞乱复杂的流程建模
有时候开发人员(我也是)不去寻找更简单的解决方案:或许用jbpm内建的节点来建模流程而导致一个不必要的复杂流程。想更简单…jBPM是非常易扩展的(actionhandlers,定制节点类型)并且有时比用存在的节点做简单的建模还要容易,这可以使得事情没有那么复杂。
例如:假设你有这样一个需求,在一个依赖于地理定位的特定泳道内指派一个任务。(如果一个任务发生在纽约,它指派给用户A,如果它发生在芝加哥那么指派给用户B)
拿到org.jbpm.taskmgmt.def.Task.java这个类并且增加下述的字段和方法:

private String taskLocation;
 
public String getTaskLocation() {
   return taskLocation;
}
public void setTaskLocation(String taskLocation){
   this.taskLocation = taskLocation;
}

 

现在为Task.java修改hibernate配置文件,在Task.hbm.xml中:

<property name="taskLocation" column="TASKLOCATION_" ></property>

 

最后修改JpdlXmlReader.java以使得当流程从数据库中读入时新的属性被注入到Task类中。

String taskLocation = taskElement.attributeValue("taskLocation");

if (taskLocation==null) {
         taskLocation = taskElement.attributeValue("taskLocation");
}
    
if (taskLocation != null){
          task.setLocation(taskLocation);
}

 

另一个定制的例子可以应用到你的查询中:假设你想用很多规则来过滤你的任务:考虑一个用JSF来做渲染的任务列表和一个任务过滤窗口,这个窗口中你可以按照优先级,日期,执行人,任务名称等来过滤任务。
一个不会使得事情更复杂的,实现它的方式是,给任务实例增加过滤器:仅仅是打开任务实例的hibernate文件并且添加一些hibernate过滤器:

<filter name="filterPriority"  condition=":paramPriority = PRIORITY_"/>    
    <filter name="filterDesc"      condition=":paramDesc = DESCRIPTION_"/>        
    <filter name="filterId"        condition="str(ID_) LIKE (:paramId) "/>    
    <filter name="filterCreate"    condition="CREATE_ BETWEEN :paramFrom and :paramTo"/>  

 

注意,传递给过滤器的参数以“ : ”开始,而其它的字段(像_ID)属于TaskInstance。然后当你填充你的数据库时,使被选择的过滤器生效:

String sql  = "from org.jbpm.taskmgmt.exe.TaskInstance";
session.enableFilter("filterPriority").setParameter("paramPriority","2");
Query queryParent = session.createQuery(sql);   
List list = queryParent.list();
Iterator iter = list.iterator();
 while (iter.hasNext()) {   
  TaskInstance taskInstance = (TaskInstance)iter.next();
 }

 

6) 如果你有复杂的规则,雇用一个Drool的开发人员
一个工作流引擎(或者传统的面向图的编程)是关于制定一个代表执行的图。节点可以展现为等待状态。一个规则引擎是关于指定一套规则然后为指定的一套事实库应用一个推理算法。Drools怎样同JBPM相配合呢?一个最佳的实践是用JBPM来使一个规则引擎中的Handlers中的全部或部分逻辑具体化。换句话说,JBPM引擎能够由Drools规则引擎来驱动。
结合其它观点,这一做法也并非适用于所有情况:问问自己几件事:
我的java Action Handlers有多复杂?如果你仅仅需要从数据库中读取一些数据,而不需要更多的,这可能不适合用一个规则引擎。然而,在用java来实现一个适量处理的场合,当实现你的JBPM处理器时是值得考虑用Drools的。这是因为大多数的应用开发随着时间会越来越复杂,而Drools会让你轻松地应付这些,特别是如果你的应用的剩余时间是在中期或更长。更进一步,Drools通过在一个或多个很容易配置的XML文件中指定业务规则可以帮助你对付将来的变化。
Drools的另一个得分点是,Drools指导开发人员正确地编写代码来做正确的事情。同时规则更容易阅读然后编码,因此你的职员将会更适合于它。
更进一步,正确地使用,Drools能记住的不仅仅是信息,而且还有使用这些信息的以前的测试的结果,给整个应用一个快速的提升。
7) 用还是不用BPEL
BPEL是一个XML语言,用来描述长期运行的web服务的交互。它主要被用来集中地编排消息交换,因此在SOA中是一个关键的要素。
BPEL与JPDL有什么共同点呢?
两个语言都有一个过程标记
同外部代理交互
对于活动的调度
异常处理
错误恢复
即使他们有一些共同点,这些元素的具体表达式导致不同的听众:例如讨论过程标记:

JPDL用简单的含义来反应组织过程
BPEL用复杂的场景来描述结构化的组成

而与外部代理的交互也被不同地利用:

BPEL是面向文档的,因此主要在公司边界上使用
JPDL是面向对象的,因此它是公司组件的主干

BPEL将人之间的交互代理给partner service
jPDL提供集成的任务管理

因此我应该什么时候使用BPEL?
当你需要你的流程很轻便的伸展到java平台之外。BPEL流程能够在基于java平台的编排的服务器上被执行或者在任何其它的软件平台上(例如.NET)。这一点在使用不同平台的不同的合作伙伴之间进行商业交互的场景中是特别重要的。当没有直接的人员涉及,你可能更需要对长期运行的业务流程的支持。
当你需要以一个相对简单的方式取得事务补偿时。在已经完全成功的业务流程中的补偿,或者取消步骤是业务流程中最重要的概念。补偿的目标是撤销,作为一个已经被放弃的业务流程的一部分已经被执行的前续节点的影响。
当这些条件不满足时使用JPDL。


 

  • 大小: 50.6 KB
3
2
分享到:
评论
1 楼 whaosoft 2009-03-28  
以前我没用过这个  现在做hr系统我用到了这个 好难写啊

相关推荐

    jbpm jbpm3 jbpm4 用户和开发指南+教程+最佳实践全套

    "JBPM最佳实践.txt"则可能包含了一系列在实际项目中运用jbpm时的最佳实践建议,如性能优化、流程设计原则、错误处理策略等,旨在帮助开发者避免常见问题,提升项目的质量和效率。 通过这些文档,学习者可以全面了解...

    jbpm4jbpm5

    jbpm应用开发指面(胡奇).pdf可能是胡奇专家对jbpm应用开发的实践经验分享,可能包含了最佳实践、常见问题解决方案和案例研究。开发者可以从中学到如何在实际项目中有效地运用jbpm,以及如何解决开发过程中遇到的...

    jbpm开发实例源码

    【jbpm开发实例源码】是一个关于jbpm的实践项目,旨在帮助开发者深入理解并掌握jbpm的工作流引擎。jbpm(Java Business ...通过对源码的深入剖析,不仅可以理解jbpm的工作原理,还能掌握实际项目开发中的最佳实践。

    jbpm白皮书 介绍jbpm 入门

    - **社区支持**:活跃的开发者社区提供了丰富的资源和支持,有助于快速解决问题和获取最佳实践。 - **易于集成**:与其他 Java EE 应用和服务的无缝集成能力,使得 jBPM 能够轻松融入现有的企业环境中。 - **扩展性*...

    JBPM修改数据库教程以及实例

    【JBPM修改数据库教程及实例】 JBPM,全称Java Business Process Management,是一个开源的工作流管理系统,用于管理和执行...在实践中,务必注意备份数据,以防万一,并确保遵循最佳实践,以保证系统的安全和可靠性。

    JBPM范例 可以运行 简单易懂 快速掌握JBPM

    3. **文档**:可能有详细的步骤指南、API参考、最佳实践等,帮助用户理解示例并自己动手实践。 4. **数据库脚本**:用于初始化JBPM所需的数据库表和数据。 要快速掌握JBPM,首先需要安装并运行JBPM环境,然后逐个...

    jbpm jar java

    【jbpm jar java】——深入理解jbpm与Java的整合应用 jbpm,全称是JBoss Business Process Management,是一款...在实际开发中,理解jbpm的核心概念、API使用以及最佳实践,将有助于构建高效、灵活的业务流程系统。

    jbpm中文文档--英文文档

    8. **示例与最佳实践**:提供一系列示例流程,帮助读者更好地理解jbpm的实际应用,并给出一些最佳实践建议。 《jbpm-jpdl.pdf》文件可能是关于JPDL更深入的参考资料,可能包括JPDL的高级特性和复杂用法,例如事件...

    jbpm4.4学习教程

    jbpm4.4的学习不仅限于技术层面,还需要理解业务流程管理的理论和最佳实践。因此,在学习过程中,不仅要关注技术细节,还要思考如何将jbpm4.4与实际业务场景相结合,提升工作效率和组织协作能力。希望这个教程能为您...

    JBPM4.0源码以及分析

    这些文档对于理解JBPM的工作原理、API使用和最佳实践至关重要。它们可以帮助开发者快速上手,避免在实际项目中遇到不必要的困扰。 总结来说,JBPM4.0通过PVM和JPDL提供了强大的流程管理和执行能力,它的源码提供了...

    jbpm3.1.4经典学习教程

    "JBPM工作流开发指南v10-20070706.rar"这份文档可能是较新的指南,虽然版本号与标题不符,但依然能提供关于jbpm更广泛和深入的信息,包括最佳实践、优化技巧以及可能存在的问题和解决方案。 总的来说,通过这个教程...

    jbpm 入门及帮助文档

    "jbpm开发指南.pdf"则可能进一步深入到jBPM的高级特性和最佳实践。这份文档可能会探讨如何使用jBPM与Spring、Hibernate等其他框架集成,实现更复杂的业务逻辑。它也可能包含如何编写自定义工作流监听器、事件处理器...

    【转载 见附件】纵观jBPM:从jBPM3到jBPM5以及Activiti5

    10. **最佳实践和案例研究** - 提供实际使用中的最佳实践,以及一些成功的案例,帮助读者更好地理解和应用这两个工具。 总的来说,这篇文章将为读者提供一个全面的视角,理解jBPM的历史发展,以及在面对新的流程...

    jbpm扩展包(jbpm_adapter.jar)

    使用jbpm_adapter.jar可能涉及到部署到应用程序服务器、配置相关环境变量以及整合到现有业务系统中,这些步骤都需要遵循特定的指南或最佳实践。 10. **安全性和权限管理**: 考虑到数据敏感性,jbpm_adapter.jar...

    jbpm4.rar_jbpm_jbpm designer_jbpm4

    文档可能还涵盖了jBPM 4的新特性、最佳实践和常见问题解答。通过阅读这份文档,开发者可以深入了解jBPM 4的工作原理,掌握如何有效地利用它来管理和优化业务流程。 总结起来,jBPM 4是一个强大的业务流程管理框架,...

    jbpm4.3 中文文档

    中文文档的详细内容将涵盖以上各个部分,包括安装指南、快速入门、API参考、案例研究、常见问题解答等,帮助读者逐步掌握jbpm4.3的使用方法和最佳实践。通过深入学习,开发者不仅能熟练操作jbpm4.3,还能理解业务...

    jbpm中文指南(包括3和4的)

    【jbpm中文指南】是一份综合性的文档,涵盖了jbpm的第三版和第四版的相关内容。jbpm是一款开源的工作流程管理系统...指南将详细解析每个版本的功能特性、配置方法和最佳实践,帮助读者从理论到实践全面掌握jbpm的使用。

    jbpm源码阅读之一

    设计模式是软件工程中的最佳实践,对于理解任何复杂系统的源码都是非常有帮助的。jbpm作为一个成熟的企业级框架,很可能会大量运用这些设计模式,比如工厂模式用于创建流程实例,观察者模式用于事件通知,策略模式...

    jBPM6 Developer Guide

    10. **案例研究与最佳实践**:通过阅读书中的案例,了解实际项目中如何运用jBPM6解决具体问题,掌握最佳实践和技巧。 《jBPM6 Developer Guide》附带的代码示例(jBPM6-Developer-Guide-code)将帮助你实践以上概念...

    jbpm.rar_jbpm_jbpm 3.0 books

    对于开发者来说,这是一个宝贵的资源,可以帮助他们快速掌握jbpm的使用方法和最佳实践。 www.pudn.com.txt可能是一个链接或引用来源的文本文件,通常在分享资源时,会包含一些下载链接或者发布者的相关信息。在本例...

Global site tag (gtag.js) - Google Analytics