第 13 章 执行模式
这里有三种基本的流程执行模式:对象,持久化和嵌入。 对于持久化和嵌入执行模式, 流程执行必须在一个事务中执行。在那种情况, 流程执行必须放在一个环境的内部。 环境将用来绑定流程执行,更新到一个应用事务的事务中。 环境可以被用来绑定,比如一个JDBC连接, JTA,BMT,Spring事务等等。
13.1. 对象执行模式
对象执行模式是使用流程虚拟机的最简单形式。 这意味着通过客户端API直接使用流程定义和执行对象。 让我们通过一个例子演示这个。 我们通过创建一个ClientProcessDefinition开始,看起来像这样:
对象执行模式是使用流程虚拟机的最简单形式。 这意味着通过客户端API直接使用流程定义和执行对象。 让我们通过一个例子演示这个。 我们通过创建一个ClientProcessDefinition开始,看起来像这样:
图 13.1. 贷款流程
ClientProcessDefinition processDefinition = ProcessFactory.build("loan")
.activity("submit loan request").initial().behaviour(AutomaticActivity.class)
.transition().to("evaluate")
.activity("evaluate").behaviour(WaitState.class)
.transition("approve").to("wire money")
.transition("reject").to("end")
.activity("wire money").behaviour(AutomaticActivity.class)
.transition().to("archive")
.activity("archive").behaviour(WaitState.class)
.transition().to("end")
.activity("end").behaviour(WaitState.class)
.done();
ProcessFactory是一个帮助类, 为构建一个表现为流程定义的对象图提供方便。 AutomaticActivity是一个通过活动, 没有任何操作发生,WaitState会等到外部signal发生。 这两个活动实现都会在后面讨论更深。
processDefinition对象作为一个工厂,为流程实例对象。 一个流程实例表现为流程定义的一个执行。 更准确的说,流程实例是执行的主路径。
ClientExecution execution = processDefinition.startProcessInstance();
一个流程实例自己也是一个Execution. 潜在的,一个执行可以拥有子执行 表现执行的同步路径。
execution可以看做是一个状态机, 在流程定义里像描述一样操作。启动一个流程实例意思是 流程定义的初始节点被执行。 因为这是一个自动活动,执行会执行到evaluate活动。 evaluate活动是一个等待状态。 当执行到达evaluate活动,startProcessInstance方法 会返回并等待一个外部signal使用signal方法提供。 所以在startProcessInstance之后,我们可以证实 如果执行定位在evaluate活动。
assertEquals("evaluate", execution.getActivityName());
为了让流程执行得更远,我们提供一个外部触发器使用 signal方法。执行的结果会被作为 signalName参数给与,像这样:
execution.signal("approve");
WaitState活动实现会根据给出的signalName 选择转移。所以执行将首先执行自动活动wire money 然后在进入等待状态archive后 返回。
assertEquals("archive", execution.getActivityName());
当执行在archive活动等待时,默认的signal会让它 选择第一个未命名的转移。
execution.signal();
assertEquals("end", execution.getActivityName());
流程执行在客户端的线程中。 startProcessInstance方法只在到达evaluate活动时返回。 换句话说,ClientProcessDefinition.startProcessInstance和 ClientExecution.signal方法会一直堵塞直到 下一个等待状态的到来。