jBPM5.4官方文档翻译—第四章快速入门

felix_alone2012 2013-09-14
、快速入门
4.1. 调用Java服务
  4.1.1  使用脚本任务
  4.1.2  使用Java处理程序
  4.1.3 编写你自己的特定域任务
本章包含了一些简单、通用的任务,你可以遵循这些任务来开始你的快速入门学习。

4.1. 调用java服务
很常见的情况是,你已经有了写好的Java代码,你想要在你的流程中去调用它。你可以怎么做呢?实现这个有很多不同的方式,这个快速入门的实例会告诉你一些可选的方案。

4.1.1 使用脚本任务
在你的流程中包含一些Java代码的调用的最简单的方式是使用一个脚本任务节点。在执行流程的时候,在执行到脚本任务节点的时候,就会执行一些脚本代码。这样就可以在流程中包含我们要调用的Java代码了。例如,下面的例子包含了一个脚本任务来调用一些已经存在的Java代码:

这个脚本任务定义了一个脚本,在流程执行到达这个节点的时候就会执行脚本代码。在这个例子中,脚本会调用一个存在的Java类org.jbpm.examples.quickstarts.HelloService
的方法:
HelloService.getInstance().sayHello(person.getName());
而HelloService的类像这样:
package org.jbpm.examples.quickstarts;
public class HelloService {
  private static final HelloService INSTANCE = new HelloService();
  public static HelloService getInstance() {
    return INSTANCE;
  }
  public void sayHello(String name) {
    System.out.println("Hello " + name);
  }
}
这个脚本取回了一个HelloService类的实例,并传入了一个person对象的name来调用sayHello方法。这个是可能的,因为person可以定义为流程的一个变量,类型为org.jbpm.examples.quickstarts.Person ,而脚本任务节点可以直接引用流程变量就好像它们是局部变量一样(至少是可以直接读取的,要设置变量的值的话,你需要使用这种方式kcontext.setVariable(name, value))。这个流程同时也引用了HelloService类,因为可以使用import语法将HelloService类导进来。
内部的XML文件内容会是这样的;
<?xml version="1.0" encoding="UTF-8"?> <definitions id="Definition"             targetNamespace="http://www.jboss.org/drools"             typeLanguage="http://www.java.com/javaTypes"             expressionLanguage="http://www.mvel.org/2.0"             xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"             xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd"             xmlns:g="http://www.jboss.org/drools/flow/gpd"             xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"             xmlns:dc="http://www.omg.org/spec/DD/20100524/DC"             xmlns:di="http://www.omg.org/spec/DD/20100524/DI"             xmlns:tns="http://www.jboss.org/drools">  <itemDefinition id="_personItem" structureRef="org.jbpm.examples.quickstarts.Person" />  <process processType="Private" isExecutable="true" id="org.jbpm.examples.quickstarts.script"            name="Sample Process" tns:packageName="defaultPackage" >    <extensionElements>      <tns:import name="org.jbpm.examples.quickstarts.HelloService" />    </extensionElements>    <!-- process variables -->    <property id="person" itemSubjectRef="_personItem"/>    <!-- nodes -->    <startEvent id="_1" name="StartProcess" />    <scriptTask id="_2" name="Script" >      <script>HelloService.getInstance().sayHello(person.getName());</script>    </scriptTask>    <endEvent id="_3" name="End" >      <terminateEventDefinition/>    </endEvent>    <!-- connections -->    <sequenceFlow id="_1-_2" sourceRef="_1" targetRef="_2" />    <sequenceFlow id="_2-_3" sourceRef="_2" targetRef="_3" />  </process>  <bpmndi:BPMNDiagram>    <bpmndi:BPMNPlane bpmnElement="org.jbpm.examples.quickstarts.script" >      <bpmndi:BPMNShape bpmnElement="_1" >        <dc:Bounds x="45" y="45" width="48" height="48" />      </bpmndi:BPMNShape>      <bpmndi:BPMNShape bpmnElement="_2" >        <dc:Bounds x="131" y="46" width="80" height="48" />      </bpmndi:BPMNShape>      <bpmndi:BPMNShape bpmnElement="_3" >        <dc:Bounds x="252" y="47" width="48" height="48" />      </bpmndi:BPMNShape>      <bpmndi:BPMNEdge bpmnElement="_1-_2" >        <di:waypoint x="69" y="69" />        <di:waypoint x="171" y="70" />      </bpmndi:BPMNEdge>      <bpmndi:BPMNEdge bpmnElement="_2-_3" >        <di:waypoint x="171" y="70" />        <di:waypoint x="276" y="71" />      </bpmndi:BPMNEdge>    </bpmndi:BPMNPlane>  </bpmndi:BPMNDiagram></definitions>

这个流程要执行的话,可以写一个简单的测试:简单的创建一个ksession对象并根据流程定义文件的Id来开始流程,传递一个Person对象,用它设置为person流程变量的值。

public class JavaServiceQuickstartTest extends JbpmJUnitTestCase {
  @Test
  public void testProcess() {
    StatefulKnowledgeSession ksession = createKnowledgeSession("test.bpmn");
    Map<String, Object> params = new HashMap<String, Object>();
    params.put("person", new Person("krisv"));
    ksession.startProcess("org.jbpm.examples.quickstarts.script", params);
  }
}
这个例子显示了使用脚本任务将定制的java 代码包含到你的流程中是多么的容易的,只需要调用存在的代码并传入流程实例变量的值。注意到一些节点类型指定一个进入一个退出动作(在节点触发或者离开的时候会执行这些动作)。这样也允许包含你的脚本进来的,就像你使用脚本任务的时候一样,但是这些没办法直接从图形上反映出来,一些业务用户也许对这个详细情况不感兴趣吧)

4.1.2 使用Java处理程序

4.1.3 编写你自己的特定域任务
lijiejava 2013-09-14
Global site tag (gtag.js) - Google Analytics