工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。
通俗的说,流程就是多个人在一起合作完成某件事情的必要步骤,把步骤变成计算机能理解的形式就是工作流。
工作流管理系统(WfMS,Workflow Management System)的主要功能是通过计算机技术的支持去定义、执行和管理工作流,协调工作流执行过程中,工作之间以及群体成员之间的信息交互。工作流需要依靠工作流管理系统来实现。工作流管理系统是定义、创建、执行工作流的系统,应能提供以下三个方面的功能支持:
- 定义工作流:包括具体的活动、规则等
- 运行控制功能:在运行环境中管理工作流过程,对工作流过程中的活动进行调度
- 运行交互功能:指在工作流运行中,WfMS与用户(活动的参与者)及外部应用程序工具交互的功能。
那么使用工作流管理系统有什么好处呢?
- 提高系统的柔性,适应业务流程的变化.
- 实现更好的业务过程控制,提高顾客服务质量
- 降低系统开发和维护成本
目前市面上主要的工作流框架有:Jbpm、OSWorkflow、ActiveBPEL、YAWL等.
一个工作流管理系统往往分为两部分组成,定义工作流的时候,需要给用户提供一种简单清晰的方案,一般提供给一个"流程设计器"来帮助用户有效的制定流程.我们无法让计算机依客户的方案去执行这套流程,我们必须要使用计算机能够读得懂的语言.xml能够很好的描述数据之间的关系,jBPM就对xml提供了约束文档,称为JPDL(jBPM Process Definition Language).在客户制定流程的时候,要生成一张图片给客户看,还要生成一个xml文件给计算机看.因为我们不知道客户需要什么样的流程,而且流程要给客户自由管理,比如添加一个流程,或是删除一个流程,所以这是客户需要做的,这被称为表达业务流程.我们需要做的就是让工作流系统正确的工作,管理控制流程,大致上可以分为这个两部分:
jBPM也是使用Hibernate对流程的数据进行存储,它将在数据库中创建18张表来管理不同的信息.如果数据库是Mysql,则方言一定要是MySQL5InnoDBDialect!
在Eclipse中安装完插件(GPD)后,就能使用流程设计器了.
在保存的时候将同步生成一个对应的xml文件.这个xml文件是最主要的文件.
相关概念:
Process definition---流程定义
流程定义就是整个流程的一个描述.
Process instance---流程实例
一个流程实例包括了所有运行阶段, 其中最典型的属性就是跟踪当前节点的指针。它就是一个主线.
Execution---执行
一般情况下,一个流程实例是一个执行树的根节点, 当一个新的流程实例启动时,实际上流程实例就处于根节点的位置, 这时只有它的"子节点"才可以被激活。使用树状结构的原因在于, 这一概念只有一条执行路径, 使用起来更简单。 业务API不需要了解流程实例和执行之间功能的区别。 因此, API里只有一个执行类型来引用流程实例和执行。它相当于一个支线.
ProcessEngine最核心的对象,就像Hibernate中的SessionFactory一样,做任何事情都要通过它.ProcessEngine提供了获取Service的方法,以下是获取Service的方式:
RepositoryService repositoryService = processEngine.getRepositoryService();
ExecutionService executionService = processEngine.getExecutionService();
TaskService taskService = processEngine.getTaskService();
HistoryService historyService = processEngine.getHistoryService();
ManagementService managementService = processEngine.getManagementService();
IdentityService identityService = processEngine.getIdentityService();
各个Service的作用:
RepositoryService |
管理流程定义 |
ExecutionService |
执行管理,包括启动、推进、删除流程实例等操作 |
TaskService |
任务管理 |
HistoryService |
历史管理(执行完的数据管理) |
IdentityService |
jBPM的用户、组管理 |
ManagementService |
有关查询的API:
功能说明 |
相应的查询API |
查询“流程定义” |
ProcessDefinitionQuery processDefinitionQuery = processEngine.getRepositoryService() .createProcessDefinitionQuery(); |
查询“执行对象” (流程实例) |
ProcessInstanceQuery processInstanceQuery = processEngine.getExecutionService() // .createProcessInstanceQuery(); |
查询“任务” |
TaskQuery taskQuery = // processEngine.getTaskService()// .createTaskQuery(); |
查询“执行历史” (流程实例历史) |
HistoryProcessInstanceQuery historyProcessInstanceQuery = processEngine.getHistoryService() .createHistoryProcessInstanceQuery(); |
查询“任务历史” |
HistoryTaskQuery historyTaskQuery = processEngine.getHistoryService() .createHistoryTaskQuery(); |
jBPM的API风格都是方法调用链的形式.
创建一个流程定义
被添加的文件可以是一个文件:
private ProcessEngine processEngine = Configuration.getProcessEngine();
// 部署(添加)
// jbpm4_deployment, jbpm4_deployprop, jbpm4_lob
@Test
public void deploy() {
String deploymentId = processEngine.getRepositoryService()//
.createDeployment()//
.addResourceFromClasspath("aa/aa.jpdl.xml")// 必须要有一个 .jpdl.xml 文件
.addResourceFromClasspath("aa/aa.png")//
.deploy();