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>

                                  

 

你可能感兴趣的:(jboss,活动,F#,ext,jbpm)