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
|