Eclipse+tomcat+jbpm.GPD
安装过程
安装GPD(图形化设计)
help--->Install...--->add 找到jbpm下install\src\gpd(关网安装)
配置runtime环境
window--->perferences--->JBoss jbpm-->add 找到jbpm文件
配置JPDL xml的schema
window--->perferences--->xml--->XML Catalog--->add 找到jpdl-4.4.xsd
导入开发用的jbpm包
不要servlet api与odbc
建立配置文件jbpm.cfg.xml和jbpm.hibernate.xml
设置自己的流程定义和Java类,正式开发
开发步骤
1.分析业务,建立流程process definition(业务人员)rose 建模等
2.开发人员,根据活动图建立jpdl流程定义
3.开发人员,或者是系统管理员,部署流程
4.开发人员,编写处理这个流程的代码
5.用户:发起流程实例processInstance 张三
6.用户:审批流程 李四
JBPM最大特色
JBPM益处
实现了无纸化的工作模式,
过程可监控:便于对执行过程的跟踪和监控
数据可管理:便于对数据进行检索,分析
可靠性:减少人人交互的主观错误的机率
JBPM常用领域
行政管理:行政,事业型单位
产品研发和制造:
电子商务:订单处理
其他
JBPM表结构介绍
资源库和运行时表结构
JBPM4_DEPLOYMENT,JBPM4_DEPLOYPROP,JBPM4_LOB存储流程定义相关的部署信息
JBPM4_DEPLOYMENT,JBPM4_DEPLOYPROP,JBPM4_LOB存储流程定义相关的部署信息
JBPM4_TASK存放需要人来完成的Activities(活动),需要人来参与完成的Activity 被称为Task
JBPM4_PARTICIPATION参与者表,存放参与者信息,参与者的种类有Candidate、Client、Owner、Replaced Assignee和Viewer。而具体的参与者既可以是单一用户,也可以是用户组
JBPM4_SWIMLANE泳道表。SwimLane是一种Runtime Process Role。通过SwimLane,多个Task可以一次分配到同一Actor身上
JBPM4_JOB 存放的是Timer 的定义
JBPM4_VARIABLE 存的是进行时的临时变量。
历史数据库表结构
JBPM4_HIST_PROCINST 与JBPM4_HIST_ACTINST 分别存放Process Instance和Activity Instance的历史记录
JBPM4_HIST_DETAIL 保存 Variable的变更记录
JBPM4_HIST_VAR 保存历史的变量 JBPM4_HIST_TASK Task的历史信息
JBPM4_ID_GROUP ,JBPM_ID_MEMBERSHIP ,JBPM4_ID_USER 这三张表很常见,基本的权限控制,关于用户认证方面建议还是自己开发一套,组件自带的功能太简单,使用中有很多需求难以满足
除了前面述及的17张表外,还有一张引擎参数表,这是一张独立的表,在此没有单独列出
运用请假
实例化JBPM
private ProcessEngine processEngine;
private RepositoryService repositoryService;
private ExecutionService executionService;
private void init()
{
repositoryService=processEngine.getRepositoryService();
executionService=processEngine.getExecutionService();
taskService=processEngine.getTaskService();
}
部署:
public String deploy()
{
System.out.println("部署");
init();
// String did=repositoryService.createDeployment().addResourceFromClasspath("leave2.jpdl.xml").deploy();
ZipInputStream zis = new ZipInputStream(this.getClass().getResourceAsStream("/leave2.zip"));
//发起流程,仅仅就是预定义任务,即在系统中创建一个流程,这是全局的,与具体的登陆 用户无关。然后,在启动流程时,才与登陆用户关联起来
String did=repositoryService.createDeployment().addResourcesFromZipInputStream(zis).deploy();
//使用zip方式
// ZipInputStream zis = new ZipInputStream(this.getClass().getResourceAsStream("/leave2.zip"));
// //发起流程,仅仅就是预定义任务,即在系统中创建一个流程,这是全局的,与具体的登陆 用户无关。然后,在启动流程时,才与登陆用户关联起来
// String did=repositoryService.createDeployment().addResourcesFromZipInputStream(zis).deploy();
System.out.println("did: "+did);
return SUCCESS;
}
启动:
public String start()
{
init();
Map map = new HashMap();
//在启动任务时,等于就是一个用户要请假了,那么,此时,要把流程信息关联到此用户上,在开始的下一个节点(也就是第一个任务节点),是指派给。所以用户名要与其对应的变量关联起来
map.put("owner", getLoginedUserName());
System.out.println("id_: "+id);
ProcessInstance processInstance=executionService.startProcessInstanceById(id, map);
System.out.println("启动时processInstance: "+processInstance.getId());
return SUCCESS;
}
申请:
public String submit()
{
init();
Map map = new HashMap();
//此day, 在xml文件中,有一个decision标签,里面有一个表达式:expr="#{day > 3 ? '老板审批' : '结束'}"
//即它与表达式中的day关联
map.put("day", processVo.getDay());
map.put("reason", processVo.getReason());
map.put("name", "张伟林submit");
//如果第二个参数为字符串,则是指定要向哪个方向完成,此是指定要向testhaha完成,并且如果线条上指定了文字,
//就只能按着文字去指定方向,如果没有文字,才能用map,
//也就是说,如果传递的参数为map,则流程会去寻找没定义名称的线条走,如果没找到。就抛出No unnamed transitions were found for the task 异常
//taskService.completeTask(taskId, "testhaha");
//如果第二个参数为map,则表示只是传递参数而已
System.out.println("提交完毕");
taskService.completeTask(processVo.getTaskId(), map);
return SUCCESS;
}
taskService.completeTask(id号,申请信息)
经理审批:
public String manager()
{
init();
Task task = taskService.getTask(id); //得到要审批的id'
String taskId=task.getId();
Set<String> strSet=new HashSet<String>();
strSet.add("owner");
strSet.add("day");
strSet.add("reason");
strSet.add("name");
// taskService.getVariable(taskId, "owner");
map=taskService.getVariables(taskId, strSet); //传值到前台
System.out.println("map: "+map);
return SUCCESS;
}
经理提交
public String submitManager(){
init();
taskService.completeTask(id, result); //result表示申请通过和不通过
return SUCCESS;
}
显示:
public String view()
{
init();
//通过id查到流程实例
ProcessInstance processInstance = executionService.findProcessInstanceById(id);
Set<String> activityNames = processInstance.findActiveActivityNames();
//Coordinates为相依衣物
ac = repositoryService.getActivityCoordinates(processInstance.getProcessDefinitionId(),activityNames.iterator().next());
return SUCCESS;
}