`
pengchua
  • 浏览: 152619 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

JBOSS JBPM 学习笔记

阅读更多

工作流系统是以规格化的流程描述作为输入的软件组件,它维护流程的运行状态,并在人和应用之间分派活动。

一些基本的术语:

流程定义(process definition)是一个业务流程或过程的规格化描述。

流程实例(process instance. 是流程定义的一个运行实体。

流程上下文变量(process context variable ,或简称变量,是与流程实例相关的变量

<o:p> </o:p>

package com.sample;<o:p></o:p>

<o:p> </o:p>

import junit.framework.TestCase;<o:p></o:p>

import org.jbpm.graph.def.ProcessDefinition;<o:p></o:p>

import org.jbpm.graph.exe.ProcessInstance;<o:p></o:p>

import org.jbpm.graph.exe.Token;<o:p></o:p>

<o:p> </o:p>

public class testHelloWorldProcess extends TestCase {<o:p></o:p>

       public void testHelloWorldProcess() {<o:p></o:p>

              // 这个方法展现流程定义和流程执行的定义<o:p></o:p>

              // 流程定义有3个节点.<o:p></o:p>

              // 一个未命名的开始状态start-state,一个状态 's'<o:p></o:p>

              // 一个结束状态名字为'end'.<o:p></o:p>

              // 下面行解析一个xml text为一个ProcessDefinition对象(流程定义)<o:p></o:p>

              // ProcessDefinition 把流程定义形式描述为java对象<o:p></o:p>

              ProcessDefinition processDefinition = ProcessDefinition<o:p></o:p>

                            .parseXmlString("<process-definition>" + "  <start-state>"<o:p></o:p>

                                          + "    <transition to='s' />" + "  </start-state>"<o:p></o:p>

                                          + "  <state name='s'>" + "    <transition to='end' />"<o:p></o:p>

                                          + "  </state>" + "  <end-state name='end' />"<o:p></o:p>

                                          + "</process-definition>");<o:p></o:p>

<o:p> </o:p>

              // 下一行建立了一个流程执行定义.<o:p></o:p>

              // 在构造后,流程执行有一个主要的执行路径<o:p></o:p>

              // (= root token 根令牌) 此时位置在start-state处<o:p></o:p>

              ProcessInstance processInstance = new ProcessInstance(processDefinition);<o:p></o:p>

<o:p> </o:p>

              // 在构造后流程执行有一个主要的执行路径<o:p></o:p>

              // (= roottoken 根令牌) .<o:p></o:p>

              Token token = processInstance.getRootToken();<o:p></o:p>

<o:p> </o:p>

              // 构造后, 位置处于流程定义执行路径start-state的位置<o:p></o:p>

              assertSame(processDefinition.getStartState(), token.getNode());<o:p></o:p>

<o:p> </o:p>

              // 现在开始流程执行,离开start-state 结束默认的转换(transition)<o:p></o:p>

              token.signal();<o:p></o:p>

              // 这个signal方法将会阻塞直到流程执行进入 wait 状态<o:p></o:p>

<o:p> </o:p>

              // 流程执行在状态's' 进入第一个 等待状态<o:p></o:p>

              // 因此执行主路径现在位置在 状态's'<o:p></o:p>

              assertSame(processDefinition.getNode("s"), token.getNode());<o:p></o:p>

<o:p> </o:p>

              // 我们再送另外一个信号signal. 这将继续执行离开状态's' 结束默认的转换(transition)<o:p></o:p>

              token.signal();<o:p></o:p>

              // 现在信号signal方法将返回,因为流程实例到达了end-state 结束状态<o:p></o:p>

<o:p> </o:p>

              assertSame(processDefinition.getNode("end"), token.getNode());<o:p></o:p>

       }<o:p></o:p>

<o:p> </o:p>

}<o:p></o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

对于流程定义可以要用JBoss的图形自动生成

<o:p><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype><v:shape id="_x0000_i1025" style="WIDTH: 414.75pt; HEIGHT: 311.25pt" type="#_x0000_t75"><v:imagedata src="file:///C:\DOCUME~1\pengch\LOCALS~1\Temp\msohtml1\01\clip_image001.png" o:title="ScreenShot047"></v:imagedata></v:shape></o:p>

<v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype><v:shape id="_x0000_i1025" style="WIDTH: 414.75pt; HEIGHT: 311.25pt" type="#_x0000_t75"><v:imagedata src="file:///C:\DOCUME~1\pengch\LOCALS~1\Temp\msohtml1\01\clip_image001.png" o:title="ScreenShot047"></v:imagedata></v:shape><o:p></o:p>

点击source会生成下面的代码:<o:p></o:p>

<?xml version="1.0" encoding="UTF-8"?><o:p></o:p>

<o:p> </o:p>

<process-definition<o:p></o:p>

  xmlns="urn:jbpm.org:jpdl-3.1"  name="test"><o:p></o:p>

   <start-state name="start"><o:p></o:p>

      <transition name="" to="s"></transition><o:p></o:p>

   </start-state><o:p></o:p>

 <o:p></o:p>

   <state name="s"><o:p></o:p>

      <transition name="" to="end"></transition><o:p></o:p>

   </state><o:p></o:p>

   <o:p></o:p>

   <end-state name="end"></end-state><o:p></o:p>

</process-definition><o:p></o:p>

可以把加载流程定义文件,<o:p></o:p>

ProcessDefinition processDefinition = ProcessDefinition<o:p></o:p>

                            .parseXmlString("<process-definition>" + "  <start-state>"<o:p></o:p>

                                          + "    <transition to='s' />" + "  </start-state>"<o:p></o:p>

                                          + "  <state name='s'>" + "    <transition to='end' />"<o:p></o:p>

                                          + "  </state>" + "  <end-state name='end' />"<o:p></o:p>

                                          + "</process-definition>");<o:p></o:p>

<o:p> </o:p>

改为:<o:p></o:p>

<o:p> </o:p>

FileInputStream fis = new FileInputStream("processes/test/processdefinition.xml");<o:p></o:p>

              ProcessDefinition processDefinition = ProcessDefinition.parseXmlInputStream(fis);<o:p></o:p>

<o:p> </o:p>

<o:p> </o:p>

<v:shape id="_x0000_i1026" style="WIDTH: 24pt; HEIGHT: 24pt" type="#_x0000_t75" alt="The auction process graph"></v:shape><o:p></o:p>

<v:shape id="_x0000_i1027" style="WIDTH: 339pt; HEIGHT: 306pt" type="#_x0000_t75"><v:imagedata src="file:///C:\DOCUME~1\pengch\LOCALS~1\Temp\msohtml1\01\clip_image004.gif" o:href="mk:@MSITStore:E:\Jboss\jbpm3\jbpm3.chm::/images/auction.process.graph.gif"></v:imagedata></v:shape>
对应的流程定义文件为:<o:p></o:p>

<process-definition><o:p></o:p>
<o:p> </o:p>  <start-state><o:p></o:p>
    <transition to="auction" /><o:p></o:p>
  </start-state><o:p></o:p>
    <state name="auction"><o:p></o:p>
    <transition name="auction ends" to="salefork" /><o:p></o:p>
    <transition name="cancel" to="end" /><o:p></o:p>
  </state><o:p></o:p>
 // fork表示要进行分叉的情形 <o:p></o:p>

//一个分支把一个执行路线分割成多个兵法的执行路线. 默认分支的行为是为每个离开分支转换建立一个子令牌,在令牌要到达的分支之间建立一个父母-子女 关系.<o:p></o:p>

  <fork name="salefork"><o:p></o:p>
    <transition name="shipping" to="send item" /><o:p></o:p>
    <transition name="billing" to="receive money" /><o:p></o:p>
  </fork><o:p></o:p>
    <state name="send item"><o:p></o:p>
    <transition to="receive item" /><o:p></o:p>
  </state><o:p></o:p>
<o:p> </o:p>  <state name="receive item"><o:p></o:p>
    <transition to="salejoin" /><o:p></o:p>
  </state><o:p></o:p>
    <state name="receive money"><o:p></o:p>
    <transition to="send money" /><o:p></o:p>
  </state><o:p></o:p>
<o:p> </o:p>  <state name="send money"><o:p></o:p>
    <transition to="salejoin" /><o:p></o:p>
  </state><o:p></o:p>
   //join表示要进行合并在一起的情形 <o:p></o:p>

//默认联合(join)假设所有来自同一个父母的子令牌联合.当在上使用fork(分支)这个情形就出现了并且所有令牌分支建立,并且到达同一个联合(join).当全部令牌都进入联合的时候,联合就结束了. 然后联合将检查父母-子女. 当所有兄弟令牌到达联合(join),父母令牌将传播(唯一的)离开转换. 当还有兄弟令牌活动时,联合的行为将作为等待状态.<o:p></o:p>

<o:p> </o:p>  <join name="salejoin"><o:p></o:p>
    <transition to="end" /><o:p></o:p>
  </join><o:p></o:p>
    <end-state name="end" /><o:p></o:p>
  </process-definition><o:p></o:p>

<o:p> </o:p><o:p> </o:p>

参考资料:http://dl2.csdn.net/down4/20070802/02094345367.swf<o:p></o:p>

                                  

 

分享到:
评论

相关推荐

    jbpm学习笔记.docx

    jbpm学习笔记主要涵盖了jbpm(Java Business Process Management)的多个方面,包括Signavio的使用和配置、jBPM数据库的安装、Graphical Process Designer(GPD)的安装以及jBPM在Eclipse环境中的配置。以下是这些...

    JBossjBPM.rar_工作流引擎

    在提供的压缩包中,“JBossjBPM.nh”可能是一个笔记或文档文件,详细介绍了在实际项目中使用JBoss jBPM的经验和技巧。通常,这种文件会涵盖以下内容: 1. 安装与配置:如何在本地环境中设置jBPM,包括依赖库的导入和...

    JBPM学习笔记

    ### JBPM学习笔记 #### 一、JBPM概述 JBPM是Java Business Process Management的缩写,即Java业务流程管理,这是一个开源的工作流框架。它不仅涵盖了传统的业务流程管理(BPM)、工作流管理和服务之间的协作,还...

    JBPM4学习笔记(全)

    **JBPM4学习笔记概述** JBPM(JBoss Business Process Management)是一款开源的工作流程管理系统,主要专注于业务流程的建模、执行和监控。JBPM4是JBPM的第四个主要版本,它提供了一整套工具和服务,使得企业能够...

    JBPM新手学习笔记(强烈推荐)

    1. **流程定义文件**:在JBPM中,流程的定义通常是以XML文件的形式存储,遵循特定的JPDL(JBoss Process Definition Language)语法。这个文件描述了整个业务流程的结构和行为。在示例中,报销审批流程的XML文件定义...

    jBPM-jPDL学习笔记

    jBPM(JBoss Business Process Management业务流程管理),它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。  jPDL是构建于jBPM框架上的流程语言之一。在jPDL...

    jBPM-jPDL学习笔记—框架设计简介

    jBPM,全称JBoss Business Process Management,是一款强大的开源业务流程管理框架,它涵盖了业务流程管理、工作流和服务协作等多个领域。jBPM的核心在于它的可执行流程语言,其中包括了jPDL(jBPM Process ...

    工作流学习笔记

    工作流学习笔记主要聚焦在企业级业务流程管理(Business Process Management, BPM)系统,特别是针对JBoss提供的开源工作流框架JBOSS jBPM。jBPM是一个强大的工作流引擎,它允许开发者定义、执行和管理工作流程。这...

    jbmp开发指南(OO)

    通过本文档的学习,相信读者已经对jBPM有了较为全面的认识。jBPM不仅提供了强大的工作流管理功能,还支持灵活的定制化需求。对于希望改善内部业务流程的企业来说,jBPM无疑是一个值得考虑的选择。未来随着技术的不断...

    Activiti课程笔记从入门到实践.doc

    这个框架是开源的,基于Apache许可,由Alfresco公司发起,并由前JBoss jBPM项目架构师Tom Baeyens创建。 在第一天的学习中,首先了解了工作流的基本概念。工作流是指在计算机环境中自动化执行的业务过程,通常涉及...

Global site tag (gtag.js) - Google Analytics