开始状态:
<!ELEMENT start-state ( description?, transition+ ) >
<!ATTLIST start-state name CDATA #REQUIRED
swimlane CDATA #IMPLIED >
dtd fragment for start-state
开始状态是一个过程中的唯一状态,所有的过程实例从这里开始,注意在过程实例开始的时刻你能够把变量放在过程当中了。另外重点的概念是你能够有多个从开始状态出发的变迁,这样的话,就需要你指定哪个变迁是你启动过程实例时候需要执行的。
milestone :
<!ELEMENT milestone ( description?, action*, transition ) >
<!ATTLIST milestone name CDATA #REQUIRED>
dtd fragment for a milestone
一个 milestone 是一种特殊的状态,它用来处理两个并发事件中的同步的作用。一个 milestone 可以被应用在下面情形:一条执行路径需要等待另外一个执行路径上的事件。如果 milestone 没有到达,接下来的执行就必须在 milestone 处等待,知道另外一个并发路径到达的时候,才可继续执行。如果 milestone 已经到达了(条件具备了),接下来的执行就是通过这个 milestone 状态。关于 milestone 的更多信息和图形请参看工作流模式。一个 milestone 与一或多个 actions (用信号通知 milestones 到达)相关联。那些 actions 能够用默认 ActionHandler : org.jbpm.delegation.action.MilestoneReachdActionHandler 在流程中建模。所以 actions (发信号给 jbpm 引擎告诉它一个 milestone 已经到达)能够像下面这样在 processdefition.xml 中调度:
...
<milestone name="theMilestone">
<transition to="stateAfterMilestone" />
</milestone>
...
<state name="stateBeforeReachingMilestone" swimlane="initiator">
<transition to="stateAfterReachingMilestone">
<action>
<delegation class="org.jbpm.delegation.action.MilestoneReachedActionHandler">theMilestone</delegation>
</action>
</transition>
</state>
...
modelling a milestone in the processdefinition.xml
process-state:
<!ELEMENT process-state ( description?, delegation, action*, transition+ ) >
<!ATTLIST process-state name CDATA #REQUIRED>
dtd fragment for a process-state
一个 process-state 符合父过程的 invocation 。父过程执行到一个 procee-state 时候就开始一个子过程的执行。过程残留在 process-state 中用以子过程的持续。当一个子过程完成后,就从一个 process-state 中离开了。
Decision:
<!ELEMENT decision ( description?, delegation, action*, transition+ ) >
<!ATTLIST decision name CDATA #REQUIRED>
dtd fragment for a decision
一个 decision 用以决定在多个执行路径中哪个才可以被执行。如果你是一个程序员,把它可以理解成 if-then=else 结构即可,当然。一个 decision 能够具有许多离开的变迁。
需要注意的是一个 decision 对某个情况建模,在这里工作流引擎根据上下文( =variables )和一些其他外部资源决定哪个路由可以被接受。作为可供选择的(可以替代的做法),你设计从一个状态出发具备多个变迁。在那种情况下, jbpm 客户端必须通过调用以一个选择变迁名字作为一个参数的 endOfState 方法决定哪个变迁被执行。
Fork (分支):
<!ELEMENT fork ( description?, delegation ?, action*, transition+ ) >
<!ATTLIST fork name CDATA #REQUIRED
corresponding-join CDATA #IMPLIED>
dtd fragment for a fork
这个比较好理解,定义一般普通的 fork 行为一般是通过 ForkHandler 接口。但是默认行为(当在 fork 中没有 delegetion 时候)是 fork 的每个变迁都将获得一个子 token 。所以仅仅对一些高级外来的并发,你才需要实现 ForkHandler.
一般情况下,一个 fork 会有一个相关的 join 。这个 join 定义个并发的 block 。默认下 fork 和 join 仅支持严格的嵌套,并且默认情况不支持绕过并发 block 边界的变迁。
public interface ForkHandler {
void fork( ForkContext forkContext ) throws ExecutionException;
}
the ForkHandler interface
join :
<!ELEMENT join ( description?, delegation?, action*, transition ) >
<!ATTLIST join name CDATA #REQUIRED
corresponding-fork CDATA #IMPLIED>
dtd fragment for a join
一个 fork joins 用于多条路径执行,用 JoinHandler 接口指定普通的 join 行为。但是默认情况下(没有 delegation )是所有 fork 上的子 token 合并。最后 token 到达 join 将会触发父 token 最后引发 join 上的离开变迁。所以仅仅高级外来的并发你才需要实现 JoinHandler.
约束:一个 join 只能有一个离开变迁。
public interface JoinHandler {
void join( JoinContext joinContext ) throws ExecutionException;
}
the JoinHandler interface
结束状态:
<!ELEMENT end-state EMPTY >
<!ATTLIST end-state name CDATA #REQUIRED>
dtd fragment for end-state
一个过程定义有一个精确的结束状态。当一个过程实例执行到一个结束状态时候,这个过程实例就结束了。
变迁( transition ):
<!ELEMENT transition ( action* )>
<!ATTLIST transition name CDATA #IMPLIED
to CDATA #REQUIRED>
dtd fragment for a transition
变迁用来指定节点之间的连接。变迁元素应该放在 node 里面,那么这个变迁就会从这个节点出离开。
Action :
<!ELEMENT action ( delegation ) >
<!ATTLIST action event-type (process-start|process-end|
state-enter|state-leave|state-after-assignment|
milestone-enter|milestone-leave|
decision-enter|decision-leave|
fork-enter|fork-every-leave|
join-every-enter|join-leave|
transition) #IMPLIED>
dtd fragment for an action
一个 action 是一段 java 代码。在过程执行期间在一些事件基础之上 action 在工作流引擎上执行。
Action 总是被定义成一个过程定义元素( process-definition, state, transition, decision, ...
)的子元素。当 action 执行的时候,父元素会在过程执行时候外加一些事件类型来定义精确时刻。可以想象得到,一个 action 的可能事件类型依赖于 action 被包含进去的元素。 事件类型名字( event-type-names )被暗示出是他们应用到的元素(理解有误)。 在 javadoc 中有事件类型,可以进行查看。
public interface ActionHandler {
void execute( ExecutionContext executionContext );
}
the ActionHandler interface
delegation :
<!ELEMENT delegation ( #PCDATA ) >
<!ATTLIST delegation class CDATA #REQUIRED>
dtd fragment for a delegation
解释在约束元素和 delegation 类必须实现的接口之间的关联。
四、其他 process archive 文件
当一个 process archive 被部署, processdefinition.xml 将被解析并且把信息存储到 jbpm 数据库中去。所有其他的文件或者被存储在数据库中或者文件系统,与被创建的过程定义相关联。作为一 jbpm api 的客户端你能够通过 ExecutionReadService.getFile( Long processDefinitionId, String fileName )
访问这些文件。
一个 process archive 和一个过程定义( process definition )之间的区别参看 versioning mechanism 。