Activiti作为一个遵从Apache许可的工作流和业务流程管理开源平台,其核心是基于java的超快速、超级稳定的BPMN2.0流程引擎,强调流程服务的可嵌入式和可扩展性,既面向开发人员、也面向业务人员,同时扩展activiti在线流程模型设计、关联业务表单等功能,可达到面向客户的流程建模(定义)、管理等功能。
Activiti一直受业界青睐,也受开发者的青睐!下面这篇博客就来介绍jplogic之上关于activiti流程引擎的整合,后期将会推出jplogic自定义流程引擎完成jplogic关于工作流方面基本内需即可。我们都知道工作流在我们企业应用中被广泛应用,比如我们OA系统中员工与领导之间业务审批流程功能等这类拥有多参与者按照预定的规则(流程定义)传递信息、文档或者任务自动化执行,从而达到预定设定的目标的需求的功能都离不开我们的工作流引擎。同时工作流引擎只负责业务流程抽象模型的建立(定义)、解释以及运转。业务需求还是需要在具体业务模块中实现。那么如果我们业务需要按照某种预定于的规则(流程)执行的时候,我们就需要将我们业务与我们的工作流引擎关联(绑定)起来,这样我们就可以让流程引擎带动我们业务流程,那么业务流程就按照我们预定义流程运转了!从而实现我们应用业务流转的需要。也就是说单独工作流程是没有意义了!需要让工作流管理系统与我们业务系统建立管理才能使得工作流程应用变得有意义!所以现在市面上才出现了很多开源的工作流程引擎框架。那么当我们将这些独立流程引擎关联到我们应用的时候就需要让我们业务与之关联!
那么如何让这些工作流程引擎与我们业务系统灵活的关联在一起呢,这部分的工作在很多第三的开源框架都可以看到,在这里就不过多介绍。大家有兴趣的可以去了解一下,兴许你能设计出满足自己需要的流程引擎来!当然也欢迎进入群【376447127】与我交流相关技术。
以上是关于工作流程的基础说明,下面就来讲讲activit这个开源工作流程引擎,对于开发者来说activiti应用起来相对很简单。因为activiti本身提供很多丰富的API,这些API包含了大量的service,可快速的操作我们流程引擎。该流程引擎灵活的扩展到你的业务系统中可实现面向用户流程需求,不需要编写任务代码,其中就思路就是(首先将流程模型定义出来,然后动态关联我们业务表(表单)即可,其中这些业务表单动态建立,业务表也可动态建立,那么我们就需要设计在线的表单设计器来动态的创建表单,进而动态的创建业务表或者先动态创建业务表,然后再根据创建的业务表来创建我们的业务表单)。除了让我们业务关联工作流之外,我们来可以将我们应用中的权限控制与工作流程引擎关联起来,这样做可以让我们应用权限模块对流程流转业务进行控制。
好吧,说了一些关于工作流程应用的一些设计思路了!下面就来介绍activiti整合到jplogic中,activiti可以很方面的整合到你的应用中,不管是ssh\ssj\ssm等这些组合框架的搭配都很方面整合!但下面我集成到jplogic中,属于非这类搭配集成!因为jplogic的MVC架构不由这些开源框架组成!下面我把activiti作为jplogic的一个module来启动,集成如下所示:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <jplogic.config> <Platform> <!-- 应用模块 --> <modules> <!--多管理模块--> <add name="db" type="org.jplogic.system.core.soa.component.db.DbAccesscComponent" init_priority="1"/> <add name="sso" type="org.jplogic.system.core.soa.component.sso.SSOComponent" init_priority="2"/> <add name="permission" type="org.jplogic.system.core.soa.component.permission.PermissionSoaComponent" init_priority="3"/> <add name="memcached" type="org.jplogic.system.core.soa.component.memcached.cache.MemcachedCacheSoaComponent" init_priority="4"/> <add name="initParam" type="org.jplogic.system.core.soa.component.param.InitParamSoaComponent" init_priority="5"/> <add name="activiti" type="org.jplogic.system.core.soa.component.activiti.ActivitiSoaComponent" init_priority="6"/> </modules> </Platform> <!--数据库管理模块--> ..........如上所示添加activiti组件
<add name="activiti" type="org.jplogic.system.core.soa.component.activiti.ActivitiSoaComponent" init_priority="6"/>该组件代码如下所示:
package org.jplogic.system.core.soa.component.activiti; import java.util.Map; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngineConfiguration; import org.apache.log4j.Logger; import org.jplogic.system.core.ServiceContext; import org.jplogic.system.core.ebl.util.PropertiesUtil; import org.jplogic.system.core.module.IModule; import org.jplogic.system.core.soa.component.SOAComponent; public class ActivitiSoaComponent extends SOAComponent { private static Logger logger = Logger.getLogger(ActivitiSoaComponent.class); protected void initComponent() { try { this.componentType = "SOAComponent"; this.componentDescription = "初始化activiti组件"; this.componentClazz = getClass().getName(); logger.info("--componentType:" + this.componentType); logger.info("--componentDescription:" + this.componentDescription); } catch (Exception err) { logger.error(err.getMessage(), err); } } protected void initComponentOperates() { try { initActiviti(); } catch (Exception err) { logger.error(err.getMessage(), err); } } private void initActiviti() { PropertiesUtil.getInstance().initProperties("Global.properties"); //读取activiti相关配置 String jdbcDriver = PropertiesUtil.getInstance().readUrl("jplogic.framkwork.activiti.JdbcDriver"); String jdbcUrl = PropertiesUtil.getInstance().readUrl("jplogic.framkwork.activiti.JdbcUrl"); String jdbcUsername = PropertiesUtil.getInstance().readUrl("jplogic.framkwork.activiti.JdbcUsername"); String jdbcPassword = PropertiesUtil.getInstance().readUrl("jplogic.framkwork.activiti.JdbcPassword"); String databaseSchemaUpdate = PropertiesUtil.getInstance().readUrl("jplogic.framkwork.activiti.DatabaseSchemaUpdate"); ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration(); //连接数据库的配置 processEngineConfiguration.setJdbcDriver(jdbcDriver); processEngineConfiguration.setJdbcUrl(jdbcUrl); processEngineConfiguration.setJdbcUsername(jdbcUsername); processEngineConfiguration.setJdbcPassword(jdbcPassword); processEngineConfiguration.setDatabaseSchemaUpdate(databaseSchemaUpdate); //工作流的核心对象,ProcessEnginee对象 ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine(); //或者通过配置文件初始化activiti,这种方式是通过spring的方式初始化 //ProcessEngine processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml").buildProcessEngine(); ServiceContext.getContext().put("processEngine", processEngine); ServiceContext.getContext().put("repositoryService", processEngine.getRepositoryService()); ServiceContext.getContext().put("runtimeService", processEngine.getRuntimeService()); ServiceContext.getContext().put("taskService", processEngine.getTaskService()); ServiceContext.getContext().put("historyService", processEngine.getHistoryService()); ServiceContext.getContext().put("formService", processEngine.getFormService()); ServiceContext.getContext().put("managementService", processEngine.getManagementService()); ServiceContext.getContext().put("identityService", processEngine.getIdentityService()); } @SuppressWarnings("unchecked") @Override protected void OnInit(Map configSettingMap) throws Exception { super.OnInit(configSettingMap); this.doService(); } @Override public IModule GetInstance() { return this; } }以上添加对activiti支持之后,在平台中就可以调用activiti提供的API了,如果对于activiti的API使用的还不是很爽的话,可以对activiti的API再进一步的封装一遍,方面自己的应用使用activiti提供功能来完成你的流程管理模块的功能,好了,下面是jplogic针对activiti流程引擎的一个实现案例的部分截图:
流程定义主界面:
其中ProcessInstanceMngForm.jsp列表页面代码:
<%@ page language="java" contentType="text/html; charset=utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <%@ taglib uri="/WEB-INF/tagtld/htmlTagComponet.tld" prefix="JB"%> <html> <head> <JB:ComponentBase id="bomponentBase" isJudgeSession="true" disableContextmenu="true" isLoadingListener="true"></JB:ComponentBase> <style> html,body { width: 100%; height: 100%; margin: 0px; padding: 0px; overflow: hidden; } </style> </head> <body id="flow_instance_body"> <script type="text/javascript"> var formOperate = new FormOperateObject(); function okOperate(){ closeBlDialog(); } function noOperate(){ closeBlDialog(); } function toolbarOperate(id){ var gridOperate = new GridOperateObject(); if(id=='flow_instance_Toolbar0'){//刷新 gridOperate.ReloadGrid(grid_flow_instance,'',''); } } //查看流程历史 function viewHistory(processInstanceId,processDefinitionId,activityId){ var title = "流程历史"; var url = "BPHandler?_bpForm=org.jplogic.system.web.view.webform.ActivitiProcessInstanceMngForm&_operate=viewProcessInstanceHistory&processInstanceId="+processInstanceId+"&processDefinitionId="+processDefinitionId+"&activityId="+activityId; //增加一个分页标题 top.addNewTabPage(''+new Date(),url,title); } </script> <!-- 流程实例--> <JB:GridComponent id="flow_instance" colWidths="50,120,100,150,150,120,*" parentId="" setColAlign="center,left,left,left,left,left,left" setColSorting="int,str,str,str,str,tr,str" setColTypes="ch,ed,ed,ed,ed,ed,link" headerItems="选择,编号,流程定义,流程实例,任务活动编号,关联业务Key,查看历史" headerKeys="empty,id,processDefinitionId,processInstanceId,activityId,businessKey,opt" toolbarId="flow_instance_Toolbar" dataProvider="" bpForm="org.jplogic.system.web.view.webform.ActivitiProcessInstanceMngForm" operate="loadProcessInstanceList" gridType="commonGrid" enablePage="true" gridHeight="480" pagesInGrp="4" pageSize="50" editable="true" enableMultiselect="true" > </JB:GridComponent> <!-- 布局管理器 --> <!-- 流程定义列表布局 --> <JB:LayoutComponent layoutPattern="1C" parentId="flow_instance_body" id="flow_instance_layout" autoReSize="true" isAttachProgress="false"> <JB:LayoutCellComponent id="abc1" layoutCellTitle="运行中流程列表" layoutId="flow_instance_layout" layoutCellName="a" embeddedToolbarId="flow_instance_Toolbar" attachObjectId="grid_flow_instance" layoutCellHeigth="100" > <JB:ToolBarComponent id="flow_instance_Toolbar" layoutCellToolbarId="flow_instance_Toolbar" onclick="toolbarOperate" title="运行中流程列表操作" gridId="" iconsPath="images/system/images/" > <JB:ToolBarCellComponent id="flow_instance_Toolbar" cellType="button" btnSelectName="刷新" imgDisabled="refresh.gif" imgEnabled="refresh.gif" itemId="0" optionItems=""></JB:ToolBarCellComponent> <JB:ToolBarCellComponent id="flow_instance_Toolbar" cellType="separator" imgDisabled="" imgEnabled="" itemId="1" optionItems=""></JB:ToolBarCellComponent> <JB:ToolBarCellComponent id="flow_instance_Toolbar" cellType="button" btnSelectName="删除" imgDisabled="refresh.gif" imgEnabled="refresh.gif" itemId="2" optionItems=""></JB:ToolBarCellComponent> <JB:ToolBarCellComponent id="flow_instance_Toolbar" cellType="separator" imgDisabled="" imgEnabled="" itemId="3" optionItems=""></JB:ToolBarCellComponent> <JB:ToolBarCellComponent id="flow_instance_Toolbar" cellType="button" btnSelectName="查询" imgDisabled="refresh.gif" imgEnabled="refresh.gif" itemId="4" optionItems=""></JB:ToolBarCellComponent> <JB:ToolBarCellComponent id="flow_instance_Toolbar" cellType="separator" imgDisabled="" imgEnabled="" itemId="5" optionItems=""></JB:ToolBarCellComponent> </JB:ToolBarComponent> </JB:LayoutCellComponent> </JB:LayoutComponent> </body> </html>
跟踪流程执行轨迹:
以上是jplogic关于activiti集成实例部分截图效果,以上内容希望对刚接触流程引擎的朋友帮助,也欢饮大伙与我交流相关技术。