`
kayzhan
  • 浏览: 115646 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

jBPM中文开发指南(实现基本活动二)

    博客分类:
  • jbpm
阅读更多
5.5. 基本流程执行

在下一个例子里,我们会结合自动活动和等待状态。 这里例子构建了贷款审批流程,使用WaitState 和Display活动,我们刚刚创建的。 贷款流程的图形看起来像这样:
贷款流程



图 5.3. 贷款流程

使用Java构建流程图形是很乏味的事情, 因为你必须在局部变量中跟踪所有的引用。 为了解决这个问题,流程虚拟机提供了一个ProcessFactory。 ProcessFactory是一种领域特定语言(DSL),可以嵌入到Java中, 简化流程图形的结构。这个模型也叫做 流畅接口。

ClientProcessDefinition processDefinition = ProcessFactory.build("loan")
  .activity("submit loan request").initial().behaviour(new Display("loan request submitted"))
    .transition().to("evaluate")
  .activity("evaluate").behaviour(new WaitState())
    .transition("approve").to("wire money")
    .transition("reject").to("end")
  .activity("wire money").behaviour(new Display("wire the money"))
    .transition().to("archive")
  .activity("archive").behaviour(new WaitState())
    .transition().to("end")
  .activity("end").behaviour(new WaitState())
.done();

为了了解ProcessFactory的更多细节,可以参考 api文档。 ProcessFactory的另一种选择是创建一个XML语言和一个XML解析器,来表示流程。 XML解析器可以直接实例化 org.jbpm.pvm.internal.model包中的类。 这种方式一般都被流程语言选择使用。

初始化活动submit loan request和 wire the money活动是自动活动。 在这个例子中,wire the money活动的 Display实现 使用Java API来把信息输出到控制台上。但是读取器可以想象一个可选的 Activity实现,使用支付流程库的Java API 来实现一个真实的自动支付。

上述流程的一个新执行可以像下面这样启动

ClientExecution execution = processDefinition.startProcessInstance();

当startExecution方法返回时, submit loan request活动会被执行, 执行会位于evaluate活动。
位于'evaluate'活动的执行



图 5.4. 位于'evaluate'活动的执行

现在,执行处在一个很有趣的点。这里有两个转移从evaluate指向外边。 一个转移叫approve 一个转移叫reject。像我们上面解释的, WaitState实现会根据执行的signal选择转移。 让我们像这样执行'approve' signal:

execution.signal("approve");

这个approve signal会导致执行选择approve转移 它会到达wire money活动。

在wire money活动中,信息会打印到控制台里。 因为Display没有调用execution.waitForSignal(), 也没有调用其他执行传播方法, 默认流程行为只会让执行继续, 使用向外的转移到达archive活动, 这也是一个WaitState。
位于'archive'活动的执行



图 5.5. 位于'archive'活动的执行

所以只有当archive到达时, signal("approve")会返回。

另一个signal就像这样:

execution.signal("approve");

将让执行最终到达结束状态。
位于'end'活动的执行



图 5.6. 位于'end'活动的执行

5.6. 事件

事件位于流程定义中, 一系列的EventListener可以进行注册。

public interface EventListener extends Serializable {

  void notify(EventListenerExecution execution) throws Exception;

}

事件的目的是让开发者可以为流程添加程序逻辑, 不必改变流程图。 这是非常有价值的机制,可以促进业务分析人员和开发者之间的协作。 业务分析人员负责描述需求。 当他们使用流程图归档那些需求, 开发者可以获得这些图形,让它可执行化。 事件会非常方便,向一个流程中添加技术细节(比如一些数据库插入操作) 这些都是业务分析人员不感兴趣的东西。

最常用的事件是由执行自动触发的:

TODO: 在用户手册中解释事件

事件是由流程元素和事件名称结合而成。 用户和流程语言也可以出发事件, 使用编程的方式在流程中使用fire方法。

public interface Execution extends Serializable {
  ...
  void fire(String eventName, ProcessElement eventSource);
  ...
}

可以把一系列的EventListeners分配给一个事件。 但是事件监听器不能控制执行的流向, 因为它们仅仅是监听已经执行了的执行。 这与活动处理活动的行为是不同的。 活动行为可以响应执行的传播。

我们会创建一个PrintLn事件监听器, 这与上面的Display活动是非常相似的。

public class PrintLn implements EventListener {

  String message;

  public PrintLn(String message) {
    this.message = message;
  }

  public void notify(EventListenerExecution execution) throws Exception {
    System.out.println("message");
  }
}

多个PrintLn监听器 会在流程中注册。
PrintLn监听器流程



图 5.7. PrintLn监听器流程

ClientProcessDefinition processDefinition = ProcessFactory.build()
  .activity("a").initial().behaviour(new AutomaticActivity())
    .event("end")
      .listener(new PrintLn("leaving a"))
      .listener(new PrintLn("second message while leaving a"))
    .transition().to("b")
      .listener(new PrintLn("taking transition"))
  .activity("b").behaviour(new WaitState())
    .event("start")
      .listener(new PrintLn("entering b"))
.done();

第一个事件演示如何为相同的事件注册多个监听器。 它们会根据它们指定的顺序依次执行。

然后,在转椅上,这里的事件只有一种类型。 所以在那种情况下,事件类型不需要指定, 监听器可以直接添加到转移上。

一个监听器每次都会执行,当一个执行触发事件时,如果这个监听器被注册了。 执行会作为一个参数提供给活动接口, 除了控制流程传播的方法以外, 都可以被监听器使用。
5.7. 事件传播

事件会默认传播给最近的流程元素。 目的是允许监听器在流程定义或组合活动中 可以执行所有发生在流程元素中的事件。 比如这个功能允许为end事件在流程定义或一个组合活动中注册一个事件监听器。 这种动作会被执行,如果一个活动离开。 如果事件监听器被注册到一个组合活动中, 它也会被所有活动执行,当组合活动中出现了离开事件。

为了清楚地显示这个,我们会创建一个DisplaySource事件监听器, 这会把leaving信息和事件源 打印到控制台。

public class DisplaySource implements EventListener {

  public void execute(EventListenerExecution execution) {
    System.out.println("leaving "+execution.getEventSource());
  }
}

注意事件监听器的目的不是可视化,这是为什么事件监听器本身 不应该显示在图形中。一个DisplaySource事件监听器 会作为end事件的监听器添加到组合活动中。

下一个流程展示了DisplaySource事件监听器如何 作为'end'事件的监听器注册到composite活动:
一个在组合活动中为end事件注册了不可见的事件监听器的流程。



图 5.8. 一个在组合活动中为end事件注册了不可见的事件监听器的流程。

TODO 更新代码片段

下一步,我们会启动一个执行。

ClientExecution execution = processDefinition.startProcessInstance();

在启动一个新执行后,执行将在a活动中 作为初始活动。没有活动离开,所以没有信息被记录下来。 下一个signal会给与执行, 导致它选择从a到b。

execution.signal();

当signal方法返回,执行会选择转移 然后end事件会被a活动触发。 那个组合活动会被传播到组合活动和流程定义中。 因为我们的DisplaySource 监听器放到 composite活动中, 它会接收事件,把下面的信息打印到控制台中:

leaving activity(a)

另一个

execution.signal();

会选择b到c的转移。那会触发两个活动离开事件。 一个在b活动,一个在组合活动。 所以下面的几行会添加到控制台输出中:

leaving activity(b)
leaving activity(composite)

事件传播建立在流程定义的继承组合结构中。 顶级元素总是流程定义。 流程定义包含一系列活动。每个活动可以是叶子活动或者可以是一个组合节点, 这意味着它包含了一系列内嵌活动。 内嵌活动可以被使用,比如超级状态或组合活动,在内嵌流程语言中,像BPEL。

所以事件模型在组合活动和上面的流程定义中的功能是相似的。 想象'Phase one'模型一个超级状态作为一个状态机。 然后事件传播允许在超级状态中注册所有事件。 这个主意是继承组合响应图形展示。 如果一个'e'元素画在另一个'p'元素中, 'p'是'e'的父节点。一个流程定义拥有一系列定义活动。 每个活动可以拥有一系列内嵌活动。 一个转移的父节点就是它的源头和目的的第一个父节点。

如果一个事件监听器对传播的事件没有兴趣, 可以在构建流程使用ProcessFactory的propagationDisabled()。 下一个流程是与上面相同的流程, 除了传播的事件会被事件监听器禁用。 图形还是一样。
注册到'end'事件的事件监听器被禁用的流程。



图 5.9. 注册到'end'事件的事件监听器被禁用的流程。

使用流程工厂构建流程:

TODO 更新代码

所以当第一个signal在流程中调用时,end事件 会再次触发在a活动上,但是现在在组合活动的事件监听器 不会被执行,因为传播的事件被禁用了。 禁用传播是单独的事件监听器的一个属性, 不会影响其他监听器。事件会一直被触发, 传播到整个父继承结构。

ClientExecution execution = processDefinition.startProcessInstance();

第一个signal会选择从a到b的流程。 没有信息会被打印到控制台。

execution.signal();

下一步,第二个signal会选择从b到c的转移。

execution.signal()

还是两个end事件被触发, 就像上面分别在b和composite活动中。 第一个事件是b活动上的 end事件。 那将被传播给composite活动。 所以事件监听器不会为这个事件执行,因为它已经禁用了传播。 但是事件监听器会在composite活动上 为end事件执行。 那是不传播的,但是直接在composite活动上触发。 所以事件监听器现在会被执行 一次,为组合活动,就像下面控制台里显示的那样:

leaving activity(composite)


jBPM4.0中文开发指南完整版http://family168.com/tutorial/jbpm4devguide/html/index.html
  • 大小: 4.4 KB
  • 大小: 7.8 KB
  • 大小: 7.8 KB
  • 大小: 7.9 KB
  • 大小: 1.1 KB
  • 大小: 4.2 KB
分享到:
评论

相关推荐

    jBPM4.1中文开发指南

    ### jBPM4.1中文开发指南 #### jBPM4简介 jBPM(Java Business Process Model)是JBoss的一个开源项目,提供了一个灵活的工作流引擎,支持业务流程建模、执行和管理。jBPM4.1版本在原有基础上进行了多项改进,包括...

    jbpm中文开发指南.chm

    【jbpm中文开发指南.chm】是一份专为中文用户设计的JBoss Business Process Management (jbpm) 开发教程,采用CHM(Compiled Help Manual)格式,这种格式以压缩包的形式存储了大量HTML文档,便于离线查阅和快速检索...

    工作流JBPM中文开发指南

    总的来说,"工作流JBPM中文开发指南"是学习和掌握JBPM的重要资源,无论你是刚接触工作流管理的新手,还是寻求深化JBPM应用的资深开发者,都能从中受益匪浅。通过深入阅读和实践,你可以熟练地运用JBPM来设计、实施和...

    JBPM4.4中文开发指南

    总结来说,"JBPM4.4中文开发指南"是一本非常实用的资源,它帮助开发者理解和掌握如何在Java环境中设计、实现和管理业务流程。通过学习本书,你可以了解到如何使用JBPM来自动化和优化企业的业务操作,提高效率并确保...

    jbpm开发指南_中文

    **jbpm开发指南_中文** 是一份专门针对Java平台的工作流管理系统jbpm的详细教程,旨在帮助开发者深入了解和掌握jbpm的使用。jbpm是一款开源的业务流程管理(BPM)和工作流引擎,它提供了从设计、部署到执行整个业务...

    jBPM中文用户指南

    通过《jBPM中文用户指南》的学习,初学者可以掌握jBPM的基本概念和操作,进一步提升到能够设计和实施复杂的业务流程。这份指南详细介绍了每个知识点,并且以中文呈现,降低了学习门槛,对于中国用户来说是一份非常有...

    JBPM工作流开发指南(中文)

    JBPM工作流开发指南是针对使用JBPM框架进行工作流应用开发的专业参考资料,该指南以中文形式详细介绍了如何利用JBPM来设计、实现和管理业务流程。JBPM是一款开源的工作流管理系统,它允许开发者集成业务流程到应用...

    jbpm教程+中文用户指南

    "jBPM中文用户指南"则可能深入到更具体的使用场景,例如如何定义和管理用户任务,如何设置流程变量,以及如何处理流程异常。此外,用户指南通常还会介绍jbpm提供的监控工具,如流程实例的可视化跟踪,以及如何通过...

    jbpm中文教程-详细

    【jbpm中文教程-详细】 Java Business Process Management(jbpm)是开源社区提供的一款强大的业务流程管理系统,它允许开发者设计、执行和管理业务流程。jbpm不仅提供了完整的BPM(Business Process Management)...

    JBoss jBPM jPDL中文指南

    ### JBoss jBPM jPDL中文指南知识点详解 #### 一、引言 JBoss jBPM(Java Business Process Management)是一个开源的工作流引擎,主要用于实现业务流程管理和任务协调。jPDL(jBPM Process Definition Language)...

    jBPM4.4.rar_jbpm4.4_jbpm4.4 PDF

    《jBPM4.4开发指南》与《jBPM4.4中文用户手册》是深入理解jBPM4.4这一开源工作流管理系统的重要参考资料。jBPM,全称Java Business Process Management,是一个用于执行业务流程的轻量级、灵活的开源框架,它为业务...

    jbpm中文文档--英文文档

    《jbpm中文用户指南》.chm文件是jbpm的中文版用户手册,为开发者提供了全面的指导。这个文档通常会涵盖以下内容: 1. **jbpm概述**:解释jbpm的基本概念,包括工作流引擎、流程定义语言(JPDL)以及它在企业应用中...

    jBPM5_用户手册-中文版

    jBPM5 用户手册 jBPM5 是一个开源的工作流和业务流程管理(BPM)框架,专注于灵活、可扩展且与Java平台紧密结合的解决方案。...无论是开发人员还是业务分析师,都可以借助 jBPM5 来实现更高效、灵活的业务流程自动化。

    jbpm教程3.0中文版

    jbpm教程3.0中文版是针对这个早期版本的详细指南,旨在帮助开发者和业务分析师理解并掌握jbpm的核心功能和用法。 jbpm的主要特性包括: 1. **流程建模**:jbpm支持BPMN 2.0标准,这是一种业务流程建模语言,允许...

    jBPM4.4 详解 API 中文

    ### jBPM4.4 API 详解:工作流自动化的核心技术 ...以上步骤不仅为jBPM4.4的开发环境搭建提供了详实的指南,同时也深入解析了工作流自动化的基本原理与jBPM4.4的工作机制,为IT从业者及开发者提供了宝贵的参考资料。

    jbpm帮助文档(中文带源码)

    这个文档是JBPM的开发指南,旨在帮助开发者理解和应用JBPM进行工作流开发。 一、概述 JBPM的核心功能是通过JPDL(JBoss Process Definition Language)来定义和管理业务流程。JPDL是一种XML格式的语言,用于描述...

    jbpm 入门及帮助文档

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

    完善jbpm学习资料

    首先,"jBPM中文用户指南.chm"是针对中文使用者的官方文档,它详细介绍了jbpm的基本概念、安装步骤、配置方法以及如何使用jbpm来设计和执行工作流。用户指南通常会涵盖流程定义、任务管理、事件处理、异常处理等核心...

    JBPM4.3中文 用户手册

    根据提供的文件信息,可以归纳出以下关于JBPM 4.3中文用户手册的相关知识点: ### JBPM 4.3 概述 - **JBPM**(JBoss Business Process Management)是一个开源的工作流引擎,用于创建、管理和执行业务流程。 - **...

Global site tag (gtag.js) - Google Analytics