jbpm指南部分学习

来源:互联网 发布:苹果手机丢失抹掉数据 编辑:程序博客网 时间:2024/05/18 00:08

还没进行实际实践,只是就个人理解对此部分进行翻译,肯定会有很多疏漏错误地方,希望谅解:

同时希望各位给予宝贵意见。谢谢!互相学习。接下来会进一步把实践部分补上,同时对错误地方进行补充说明。

下面开始学习jbpmtutorial部分的学习。

1、介绍部分:

JBpm是一个工作流管理系统。下面的use case图显示在jbpm和所有参与者之间调用关系。

 《use case 图》可以参看jbpm站点上的图

 《use case 图》可以参看jbpm站点上的图

 《use case 图》可以参看jbpm站点上的图

工作流管理系统针对不同人员具有完全不同的含义,下面将具体解释工作流管理系统四个层次上的核心职责。

Jbpmprocess archives 作为输入,一个process archive是一种业务流程的规则描述。在一个process archive被部署以后,jbpm就能够管理这个流程的具体执行。“管理执行”的意思是指追踪流程状态(状态层次);存储流程执行的信息;集成或者定制程序的逻辑例如发email,与ERP系统整合(程序逻辑层);允许用户通过提交表单形式完成任务(用户接口层)。

主要职责:一个工作流系统的主要职责就是维护过程执行中的状态。Jbpm的状态模型以图形形式表现,它的主要成员就是节点和变迁(不知道翻译的对不对,参考一些书中petri net的翻译),一个状态是一个节点的样本。

运行时交互(runtime interaction):重要的交互包括:开始一个过程定义的实例和发出状态结束的信号。这两种jbpm交互的结果是计算出过程实例的下一个状态。

Action:状态图,提供业务流程的结构,Action是程序逻辑的一些区块(部分),程序逻辑被执行在流程中的事件之上,有三种类型事件:进去一个节点,离开一个节点,进行一次变迁,当jbpm计算下一个状态时候,一些事件被触发。

Process archives:主要有用的文件就是processdefinition.xml。分析这个文件和存储它在数据库中的动作叫做部署一个流程。前面有所介绍,这里就不多介绍了。

接下来是介绍一个创建process archive的例子。很容易就可以看到,只要看过一些petri net知识的。

2、部署 process archive

Jbpm把过程定义存储在数据库中。所以部署一个过程到jbpm中事实上也就是意味着分析过程定义文件processdefinition.xml并且把它存储到jbpm数据库中。可以通过两种方式完成:

1、                  运行ant 任务deploypar通过文件集合(如processdefinition.xml还有其他from文件)创建Process archivedeploypar部署一个process arhive到数据库,deployparjbpm.properties中获取相关属性值。这个文件主要描述jbpm的配置选项,其中包括数据库(process archive部署到的数据库),更多关于此文件(jbpm.properties)的信息请参看配置部分。另外自己加一点小说明,可以参看build.xml文件里,targer name=deploy.process.archives”部分。哪里有上面的script,包括引入的属性文件以及部署所包含的文件。

 

 

 

2、                  通过程序来进行部署

 

 

 

代码如下:

 

 

 

// create a process archive input stream

String resource = "payraise/processdefinition.xml";

InputStream is = PayRaiseTest

                   .class

                   .getClassLoader()

                .getResourceAsStream(resource);

ArchiveBuilder ab = new ArchiveBuilder(is);

JarInputStream jis = ab.getJarInputStream();

    

// deploy the process

DefinitionService ds = JbpmServiceFactory

                         .getInstance()

                         .openDefinitionService();

ds.deployProcessArchive(jis);

ds.close();

 

 

 

虽然上面代码还没看懂,大致先知道有这么一回事吧。

 

 

 

需要注意的是:这代码也是用到jbpm.properties这个配置文件,包括数据库部分。

重点:默认状态下,jbpm配置到内存数据库中,这样只是为了方便进行测试,但是当你用ant task部署流程时候,这似乎没有什么太大作用,在这种情况下,你的数据库就在你的运行时内存中。所以只有在ant task完毕时才可以进入部署结果。

3、                  开启一个流程实例

在打包和部署之后,下面的显示的代码是教你如何启动一个流程实例:

ExecutionService executionService = 

    JbpmServiceFactory.getInstance().openExecutionService("AlbertEinstein");

executionService.startProcessInstance( "payraise" );

executionService.close();

 

 

 

4、                  获取任务列表

一个token是一个状态的指针,在jbpm中,每个token能指向一个参与者,因此也就创建了在参与者和状态之间的关联。在这个token思想(state-actor)背后:当引擎开始一个状态,那就意味着工作流引擎正在等待某些额外的触发机制。如果流程定义已经被弄好了,那这时就会计算决定正在等待谁来执行操作,当token进入一个状态时候,这个计算就会被执行,所以任务里列表将是tokens(涉及到一个指定的参与者)的集合,在jbpm中参与者总是会以actoridjava.lang.string)来进行识别。

下面代码显示了获取任务列表的coding

// get an execution service for user Carl Gauss (cg)

ExecutionService executionService = JbpmServiceFactory.getInstance().openExecutionService("cg");

// get the task list for Carl Gauss (cg)

Collection tasks = executionService.getTaskList("cg");

executionService.close();

 

 

 

5、                  结束状态信号量

当流程实例被启动后,jbpm计算下一个状态以及负责此任务的责任人(参与者),流程中的计算token运行的结果是安排下一个参与者执行任务,接下来jbpm就会告诉系统所有的token都在等待这个得到任务的参与者,在例子中我们假定第一个任务就是我上面启动的的那个。(他们只是方面大家理解才举的这个例子)。当这个参与者做了决定,他会通过调用一个方法名为endOfState来通知jbpm

 

 

 

一个结束状态信号量代码:

ExecutionService executionService = 

    JbpmServiceFactory.getInstance().openExecutionService("CarlGauss");

Collection tasks = executionService.getTaskList("CarlGauss");

Token token = (Token) tasks.iterator().next();

executionService.endOfState( token.getId(), "approve" );

executionService.close();

 

 

 

 

 

 

6、                  包含一个action

Jbpm另外一个重要的方面就是在过程定义中包含actions,一个action是一断java 代码。这些代码必须在某个过程事件之上被执行。假设当一个例子流程启动后你想发个消息“message in a bottle”,你将写代码发送此消息作为一个actionhandler

public class ExampleActionHandler implements ActionHandler {

  public void execute(ExecutionContext executionContext) {

    System.out.println( "message in a bottle" );

  }

}

example action handler code

然后我们能创建在一个离开开始状态的transtion(变迁)之上的一个action

...

<start-state name="start">

  <transition to="only state">

    <action><delegation class="org.jbpm.example.ExampleActionHandler" /></action>

  </transition>

</start-state>

...

作为最最基本的,有3种事件类型(action可以被放置):进行一个变迁,进入一个节点,离开一个节点。

7、                  声明一个变量

一个变量是一个在数据库中的持久文本域,所以当想设置一个变量时候,jbpm不得不知道怎样转换对象成文本,对于下面的类型,jbpm知道如何自动转换,它们是:

Java.lang.string

Java.lang.long

Java.lang.date

Java.lang.double

Java.io.serializable

这些变量类型在processdefinition.xml中不必声明。Jbpm利用一个hashmap的东西来创建这些变量。

如果你想存储其他java类型的变量,那么你就必须在processdefition.xml中定义一个serializer。如此:

...

  <type java-type="org.jbpm.impl.YourCustomJavaType">

         <delegation class="org.jbpm.impl.YourCustomSerializer" />

  </type>

...

jpdl-fragment that declares a custom serializer

     在这里org.jbpm.impl.YourCustomSerializer必须实现org.jbpm.delegation.serializer,然后,jbpm就知道如何识别你新定义的类型变量,并把它转换成文本域(DB中)

为了避免jbpm只能自动识别serializer来使用,可以像下面这样指定变量:

...

  <type java-type="org.jbpm.impl.YourCustomJavaType">

         <delegation class="org.jbpm.impl.YourCustomSerializer" />

         <variable name="your-custom-var-name">

         <variable name="your-second-custom-var-name">

  </type>

...

jpdl-fragment that declares a custom serializer

最后是声明变迁变量,变迁变量能被actionhandler访问,但是,他们将被存储到数据库中,下面是个例子:

...

  <type>

         <transient />

         <variable name="your-transient-var-name">

         <variable name="your-second-transient-var-name">

  </type>

...

jpdl-fragment that declares transient variables

 

 

 

8、                  以客户端访问变量

 

 

 

9、                  以一个action访问变量

 

 

 

 

 

 

10、              安排任务

原创粉丝点击