下面是为流程定义启动一个新的流程实例的最简单也是 最常用的方法:
ProcessInstance processInstance = executionService.startProcessInstanceByKey("ICL");
上面service的方法会去查找 key为ICL的最新版本的流程定义, 然后在最新的流程定义里启动流程实例。
当key为ICL的流程部署了一个新版本, startProcessInstanceByKey方法会自动切换到最新部署的版本。
原来已经启动的流程,还是按照启动时刻的版本执行。
换句话说,你如果想根据特定的版本启动流程实例, 便可以使用流程定义的id启动流程实例。如下所示:
ProcessInstance processInstance = executionService.startProcessInstanceById("ICL-1");
我们可以为新启动的流程实例分配一个key(注意: 这个key不是process的key,而是启动的instance的key ), 这个key是用户执行的时候定义的,有时它会作为“业务key”引用。 一个业务key必须在流程定义的所有版本范围内是唯一的 。通常很容易在业务流程领域找到这种key。 比如,一个订单id或者一个保险单号。
ProcessInstance processInstance = executionService.startProcessInstanceByKey("ICL", "CL92837"); // 2个参数: // 第一个参数processkey,通过这个key启动process的一个实例 // 第二个参数为这里所说的实例key(instance key)
key可以用来创建流程实例的id, 格式为{process-key}.{execution-id}。 所以上面的代码会创建一个id为 ICL.CL92837的流向 (execution)。
如果没有提供用户定义的key,数据库就会把主键作为key。 这样可以使用如下方式获得id:
ProcessInstance processInstance = executionService.startProcessInstanceByKey("ICL"); String pid = processInstance.getId();
最好使用一个用户定义的key。特别在你的应用代码中,找到这样的key并不困难。提供给一个用户定义的key, 你可以组合流向的id,而不是执行一个基于流程变量的搜索 - 那种方式太消耗资源了 。
当一个新的流程实例启动时就会提供一组对象参数。 将这些参数放在variables变量里, 然后可以在流程实例创建和启动时使用。
Map<String,Object> variables = new HashMap<String,Object>(); variables.put("customer", "John Doe"); variables.put("type", "Accident"); variables.put("amount", new Float(763.74)); ProcessInstance processInstance = executionService.startProcessInstanceByKey("ICL", variables);
启动instance,必须要知道processdefinition的信息:processdefinition可以通过2种方式获取:
其他的参数:其余还可以在启动Instance的时候,给流程2个参数:
当使用一个state
活动时,执行(或流程实例) 会在到达state的时候进行等待,直到一个signal (也叫外部触发器)出现。 signalExecution
方法可以被用作这种情况。 执行通过一个执行id (字符串)来引用。
在一些情况下,到达state的执行会是流程实例本身。 但是这不是一直会出现的情况。在定时器和同步的情况, 流程是执行树形的根节点。所以我们必须确认你的signal作用在正确的流程路径上。
获得正确的执行的比较好的方法是给state活动分配一个事件监听器, 像这样:
<state name="wait"> <on event="start"> <event-listener class="org.jbpm.examples.StartExternalWork" /> </on> ... </state>
在事件监听器StartExternalWork
中,你可以执行那些需要额外完成的部分。 在这个事件监听器里,你也可以通过execution.getId()
获得确切的流程id。 那个流程id,在额外的工作完成后, 你会需要它来提供给signal操作的:
executionService.signalExecutionById(executionId);
这里有一个可选的(不是太推荐的)方式,来获得流程id, 当流程到达state
活动的时候。 只可能通过这种方式获得执行id,如果你知道哪个jBPM API调用了之后, 流程会进入state
活动:
// assume that we know that after the next call // the process instance will arrive in state external work ProcessInstance processInstance = executionService.startProcessInstanceById(processDefinitionId); // or ProcessInstance processInstance = // executionService.signalProcessInstanceById(executionId); Execution execution = processInstance.findActiveExecutionIn("external work"); String executionId = execution.getId();
要注意上面的解决方式和应用逻辑联系(太)紧密 通过使用真实业务结构的知识。
说明:
上面这一段,没有看明白,需要在后面了解Instance的处理的时候,包括了解jPDL后,编写实际例子的时候重新理解