您的位置:首页 > 产品设计 > 产品经理

宅急送项目的第七天笔记!(JBPM工作流和介绍 -- 权限管理模型)

2015-04-02 17:15 134 查看
一、回顾第一天核心内容

1、 JBPM是什么? 为我的项目带来什么?

工作流, 就是将业务流程实现自动化,非人工方式,控制任务的执行 -------- 所有业务流程 执行信息 都可以存放到数据库 中

JBPM 是目前非常流行 一个开源工作流框架

当项目业务流程非常多,而且非常复杂,使用工作流对项目进行管理,减少业务操作出错,所有业务参照

2、 jbpm工作流使用

第一个方面: 进行工作流 业务流程设计 安装GPD插件

第二个方面: 使用jbpm api 完成工作流框架操作 ProcessEngine 、 RepositoryService 、 ExecutionService 、 TaskService

jar包导入 (今天会将jbpm 集成到 bos 宅急送项目中)

3、 业务流程定义管理

1) 发布业务流程 classpath文件发布、zip压缩文件发布

Configuration ----- ProcessEngine ---- RepositoryService (流程定义相关服务) ----- createDeployment()

--- 添加资源 ddResourceFromClasspath/addResourcesFromZipInputStream ---- deploy() 发布方法

* 操作 deployment 、 lob 、deployprop 三张表

2) 查询

RepositoryService.createProcessDefinitionQuery() 查询流程定义

3) 删除

RepositoryService.deleteDeploymentCascade(java.lang.String deploymentId)

4)启动流程时,默认启动最新版本流程 startProcessDefinitionByKey ; 如何获取最新版本流程信息 orderDesc(流程id) --- 取第一个

4、 业务流程执行管理

1) 启动流程实例 ExecutionService.startProcessDefinitionByKey

*** 默认向 jbpm4_execution(实例执行信息) jbpm4_hist_procinst (实例执行历史记录) 插入记录

*** 根据task操作 jbpm4_task(任务表)、jbpm4_hist_task(历史任务表)、jbpm4_hist_actinst(活动记录表)

2) 查询我的任务 (定义任务时,为任务制定 Assignee)

*** 查询 必须先创建对应Query对象,再完成查询

第一种

TaskService.createTaskQuery().assignee(java.lang.String userId).list() ---- 可以分页、排序

第二种

TaskService.findPersonalTasks(java.lang.String userId)

3) 办理任务

TaskService.completeTask(java.lang.String taskId)

4) 向后流转一部 (主要用于多个Transition、State节点)

ExecutionService.signalExecutionById(java.lang.String executionId) 执行某个流程实例 向后一步

5、 实例运行过程中变量

通过 ExecutionService 、 TaskService 设置流程实例变量 ---- 只要同一个流程实例都可以获取变量

复杂对象保存 (在hibernate配置po类 / 实现Serializable接口)

====================================================================================

二、 流程定义语言 (预定义活动节点)

1、<process name="helloworld" xmlns="http://jbpm.org/4.4/jpdl" key="holiday"> 流程定义节点

name : 流程定义名称

key : 流程关键字(键值) ,如果不写默认key值就是name值 ,在程序通过key值去启动一个流程实例

version : 必须在数据库中存入指定版本号 (如果版本之前已经存在,报错),不指定,数据库完成自增

xmlns : 引入schema约束,编写文件提示效果 http://jbpm.org/4.4/jpdl 无提示效果

**** 将jbpm解压目录/src/jpdl-4.4.xsd 配置一下有提示

2、 流转 Transition 节点

活动都可以添加transition 流转 , 添加一个或者多个 (start 只能一个, end没有)

指定流转节点

第一种方式 : 完成任务时 getTaskService().completeTask(task.getId(), transition);

第二种方式 : 通过ExecutionService.signalExecutionById(java.lang.String executionId,transition ) 主要用于 state节点

*** 配置jpdl 提示 , 选择namespace : http://jbpm.org/4.4/jpdl
3、 流转控制节点(活动节点 Activity) ------ 绘图和UML中活动图

1) start 开始节点

2) end 结束节点 (end 正常结束 end-cancel 取消流程 end-error 流程异常终止 )

3) state 状态节点 (自动完成一些任务节点, 比如 发送确认邮件 ) ---- 该节点会停留

*** 通过ExecutionService.signalExecutionById(java.lang.String executionId,transition )

4)decision 判断节点

*** 用于分支情况

指定handler 必须实现接口 DecisionHandler

*** 根据流程中变量,判断走向哪个Transition

5)fork/join 分支、合并节点

*** fork用来表示分支,并行一定要执行任务 ,使用fork后,一定要用join 将分支合并

*** decistion 代表在满足特点条件,分支任选其一

获得所有获得name : pi.findActiveActivityNames();

ActivityCoordinates c = processEngine.getRepositoryService()

.getActivityCoordinates(processDefinitionId, activityName);

获得获得节点坐标【x 横坐标 y 纵坐标 width 宽度 height 高度】

System.out.println("x=" + c.getX()

+ ",y=" + c.getY()

+ ",width=" + c.getWidth()

+ ",height=" + c.getHeight());

6)task 任务节点

**** 存在负责人,由指定负责人进行任务办理

三种分配任务方式 (个人任务)

第一种 :绘制图时,指定<task name="办理" assignee="张三"> 缺点:负责人固定,不利于维护

将负责人指定为一个变量 格式 #{变量名 } <task name="办理" assignee="#{userId}">

第二种 :在<task> 中编写 <assignment-handler class="" > 由指定class负责指定负责人 , 该类必须实现 AssignmentHandler

assignable.setAssignee("负责人");

*** 加入逻辑,比如有流程变量,通过变量来指定,没有流程变量 ,设置默认负责人

第三种 :在任务完成前,都可以更换负责人 taskService.assignTask(任务id, 负责个人)

三种分配任务方式 (组任务) ------ 存在一个任务,任务由指定一组人来完成,组内每个人都有完成任务的能力

第一种 : assignment type : candidate-users expression: 小王,小李,小张

JBPM4_PARTICIPATION 表存放组任务用户信息

查询个人组任务 java.util.List<Task> findGroupTasks(java.lang.String userId)

**** 只要是组内用户都可以查询到组任务

**** 拾取任务 : 组内的一个用户,将组任务 变为 个人任务 TaskService.takeTask(taskid, user);

**** 拾取任务后的操作 : 1) 小李拾取任务后完成 taskService.completeTask 2) 小李没时间做 ,改变任务负责人 taskService.assignTask 3) 小李没时间做, 找不到负责人 ,将任务归还任务组

第二种 : 在<task> 中编写 <assignment-handler class="" > 由handler 指定负责人

Assignable.addCandicateUser(组任务用户)

第三种 : 对已经存在任务,添加组用户

processEngine.getTaskService().addTaskParticipatingUser(taskId,userId, Participation.CANDIDATE);

====================================================================================

三、 自定义活动节点

绘制流程图,为图添加custom 节点 (自定义活动节点)

jbpm 提供 Activity 接口 代表一个活动 , 预定义活动 实现 ActivityBehaviour 接口 , 如果自定义活动节点实现 ExternalActivityBehaviour

@Override

public void execute(ActivityExecution activityexecution) throws Exception {

// 该活动 被执行了

}

@Override

public void signal(ActivityExecution activityexecution, String s,

Map<String, ?> map) throws Exception {

// 代表流程 在当前节点停留,离开前执行的操作

}

**** 自定义活动,默认不会在节点停留 ------ 不停留,就不会signal

execute方法中操作

1,ActivityExecution.waitForSignal(),在当前节点等待。

2,ActivityExecution.takeDefaultTransition(),使用默认的Transition离开,当前节点中定义的第一个为默认的。

3,ActivityExecution.take(String transitionName),使用指定的Transition离开

4,ActivityExecution.end(),结束流程实例

四、 流程执行过程中事件对象 (了解)

jbpm 允许为 活动中每个节点指定 事件

1、 定义监听器 实现 EventListener 接口

2、 在根元素中,或在节点元素中,使用<on event="">元素指定事件,其中event属性代表事件的类型

a) <on>元素放在根元素(<process>)中,可以指定event为start或end,表示流程的开始与结束。

b) <on>元素放在节点元素中,可以指定event为start或end,表示节点的进入与离开

c) 在Start节点中只有end事件,在End节点中只有start事件。

d) 在<transition>元素中直接写<event-listener class="">,就是配置事件。(因为在这里只有一个事件,所以不用写on与类型)

e) 在<task>元素中还可以配置assign事件,是在分配任务时触发的。

====================================================================================

五、 将jbpm 集成到项目中

1、 将整合后jar 包 复制 bos/WebRoot/WEB-INF/lib (86个jar包)

2、 配置文件整合

jbpm : jbpm.cfg.xml jbpm.hibernate.cfg.xml log4j.properties

将 jbpm.cfg.xml jbpm.hibernate.cfg.xml 两个文件整合到bos

*** jbpm.hibernate.cfg.xml 本质是hibernate 配置文件 (hibernate配置放到 dao.xml)

<property name="mappingResources">

<list>

<value>jbpm.repository.hbm.xml</value>

<value>jbpm.execution.hbm.xml</value>

<value>jbpm.history.hbm.xml</value>

<value>jbpm.task.hbm.xml</value>

<value>jbpm.identity.hbm.xml</value>

</list>

</property>

*** jbpm.cfg.xml 需要和Spring 整合

jbpm-4.4/doc/devguide/html_single/index.html

1) 将 jbpm.cfg.xml 复制 bos/config

将 <import resource="jbpm.tx.hibernate.cfg.xml" /> 改为 <import resource="jbpm.tx.spring.cfg.xml" />

2) 配置jbpm 的 ProcessEngine

<bean id="springHelper" class="org.jbpm.pvm.internal.processengine.SpringHelper">

<property name="jbpmCfg" value="jbpm.cfg.xml"></property>

</bean>

<bean id="processEngine" factory-bean="springHelper" factory-method="createProcessEngine" />

3) 想直接得到jbpm服务对象

<bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService" />

<bean id="executionService" factory-bean="processEngine" factory-method="getExecutionService" />

====================================================================================

介绍 权限管理模型

1、 最简易的权限管理模型 (javaweb)

适用于: 用户种类不多,系统功能不是特别复杂

在用户表中添加角色字段,用字段区分用户属于哪类角色

好处: 使用起来方便,编码量不大

缺点: 管理粒度比较粗 ,维护不方便 ,不够灵活 --- 不可复用

============ 角色和资源路径关系,固定在程序,通过配置文件 xml/txt

2、 标准权限管理模块

功能表 、权限表、角色表、用户表

好处: 系统菜单可以动态定制 、维护比较方便、控制粒度精细 ---- 可复用

缺点: 开发复杂

3、 复杂权限系统

Oracle 权限控制 : 系统权限、对象权限

create table 建表 ---- 属于系统权限

select 表user 、delete 表customer ------ 属于对象权限

参考 php框架 cake 权限模型

user add / view / list / delete

new add / view / list / delete

表结构

user编号 模块 功能点

1 news add --------- 1号用户可以添加新闻

4 user list -------- 4号用户可以查询所有用户







内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: