一、回顾第一天核心内容
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号用户可以查询所有用户
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号用户可以查询所有用户