jbpm4 架构
Jbpm4架构
Jbpm4在架构上分为4种类型API来满足不同的应用场景,
从上图可以看出,黑色线条的是服务API,他通过服务的方式暴露给应用,通常这也是最简单最方便的方式,蓝色线条表示客户端API
ActivityAPI:
活动API用来实现活动在运行时的行为。因此一个活动类型实际上是一个组件,核心是实现了ActivityBehaviour接口。活动行为实现可以控制执行的流程
继承下面接口即可:
publicinterfaceActivityBehaviourextendsSerializable{
voidexecute(ActivityExecutionexecution)throwsException;
}
publicinterfaceActivityExecutionextendsOpenExecution{
voidwaitForSignal();
voidtake(StringtransitionName);
voidexecute(StringactivityName);
...
}
EventListenerAPI:
事件监听API允许使用java开发监听器,并在特定的流程事件发生时调用,像进入一个活动或离开一个活动。它与活动API类似,不同的是不能控制执行流程的传播
只要继承接口
publicinterfaceEventListenerextendsSerializable{
voidnotify(EventListenerExecutionexecution)throwsException;
}
ClientAPI:
Clientapi是相对serviceapi而已的,我个人认为其实serviceapi相关的内部api都可以归为clientapi;同样ActivityAPI和EventListenerAPI也可以认为是clientAPI一类,只是ActivityAPI就是针对Activity来继承,EventListenerAPI针对的是事件,通过事件模式来编写自己代码嵌入到jbpm中。这个API是面对的特定的某个点。
ServiceAPI:
三个主要服务:RepositoryService,ExecutionService和ManagementService。
RepositoryService管理流程定义的资源。
publicinterfaceRepositoryService{
DeploymentcreateDeployment();
ProcessDefinitionQuerycreateProcessDefinitionQuery();
...
}
ExecutionService管理运行时的执行。
publicinterfaceExecutionService{
ProcessInstancestartProcessInstanceById(StringprocessDefinitionId);
ProcessInstancesignalExecutionById(StringexecutionId);
...
}
ManagementService包含了所有管理操作来保持系统启动运行。
publicinterfaceManagementService{
JobQuerycreateJobQuery();
voidexecuteJob(longjobDbid);
...
}
从上面架构图可以看出,clientapi根据需要将操作封装Command
publicinterfaceCommand<T>extendsSerializable{
Texecute(Environmentenvironment)throwsException;
}
三个主要服务通过委派CommandService来执行操作:
publicinterfaceCommandService{
<T>Texecute(Command<T>command);
}
一个CommandService链可以看做环绕在一个命令周围的一些拦截器。这就是如何在不同的环境下进行持久化和事务支持的核心机制。(这种设计模式可以探讨)
retry-interceptor会获取hiberate的StaleObjectExceptions(因为乐观锁失败)并重新尝试执行命令。
environment-interceptor会把一个环境块放到命令执行的周围。
standard-transaction-interceptor会初始化一个StandardTransaction。hibernate会话/事务会被作为标准事务的一个资源。