第一个流程学习
-------------------------------
1. 抽象出流程的UML图;
报销过程;
2. jpbl: 写一个xml文件
用来定义上述UML图;
3. 部署;
xml需要压缩为zip格式:processDefinition.zip;
不要放在中文的路径下;
4. jbpm提供了一个例子,直接部署即可看到效果;
JbpmDemo
--------------------
Process Definition
1. jbpm自己带了一个插件,可以完成
-- UML图;
-- 根据UML自动生成jbpl语言;
-- 不用再压缩成zip格式,而直接在Eclipse使用插件完成部署;
-- 插件自动将UML图保存为jpg图片后,在IE中可以直接看到这个uml流程图;
-- 每个流程,IE的webapp中可以定位到uml流程图的任务结点位置中;
----------------
练习: 使用插件完成这个WebApp
6.X
-------------------------
1.复制designer的路径名;
2. Eclipse/links:
jbpm-jpdl.link文件
path=path;内容
3. 重启MyEclipse;
4. 目录不要是中文,需要转移;
7.0
-----------------------------
1. pluginCon
2.cmd ->进入jar路径;
3. set classpath=pluginConfigInfo.jar
java cn.itcast.PluginConfigInfo "插件的目录"
提示信息;
4. 按照提示信息完成安装;
我的第一个Jbpm部署
----------------------------------------
1. 配置MyEclipse7.0,增加jboss jbpm插件;
java cn.itcast.PluginConfigInfo "你的插件路径"
根据控制台提示信息,完成; 重启MyEclipse即可;
2. 简单的报销工作流;
(1) Web App; (2) 新建:Jboss->Process Definition; 内容放在src中;
(3) 会自动生成:src/baoxiao: gpd.xml, processdefinition.xml, processimage.jpg(UML图画完后才有);
(4) 画UML图,自动生成xml语句;
(5) 启动JBOSS服务器:jboss: /server/start.bat
(6) 部署我的jbpm:MyEclipse->baoxiao: Deployment
(7) 进入主页查看:http://localhost:8080/jbpm-console
其他的细节:在课堂讲座的笔记已经有;
进一步:工程
------------------------------------------------------------
1. 新建lib文件夹,添加jar包;
2. 配置文件:
-- 包结构,源码文件夹与普通文件夹
-- src: java, process, config;
-- config/hibernate.cfg.xml : 创建数据库
/jbpm.cfg.xml
/jbpm.mail.templates.xml
log4j.properties;
** 一个方法:创建数据:使用单元测试;
3. 创建表:32张表;
编程实现:固定模式
---------------------------------------------------------------
deployProcessDefinition();
startProcessInstance();
getTaskList();
startTask();
endTask();
1. 部署流程定义:
-- 使用测试类
-- deployProcessDefinition();
-- 从文件到实体
jbpm: ProcessDefinition;
ProcessDefinition: parseXXX();
可以解析各种形式的实体描述;
如XmlString, XMLInputStream, XmlReader等等;
无论哪个方法,都是返回ProcessDefinition对象实体;
-- 从实体到数据库
不建议直接操作session, 如session.save(ProcessDefinition);
一定要使用jbpm的API:JbpmContext;
JbpmContext.deployProcessDefinition(ProcessDefinition);
如何获取JbpmContext对象?
JbpmConfiguration.getInstance().createJbpmContext();
这些核心的API类,与Hibernate相似;
这里的事务如何控制?
JbpmContext来控制;
createJbpmContext()打开事务;
JbpmContext.close()关闭事务;
-- 执行完毕,如何知道执行成功?
查看数据库;
-- 写这个方法注意:
JbpmConfiguration.getInstance(); --- 相当于Hibernate中的Configuration.configure()
如果不接收参数,代表classpath下的Hibernate.cfg.xml;
2. 启动流程实例;
-- 过程:
得到实体;保存进数据库;
来源:(http://blog.sina.com.cn/s/blog_5ecfe46a0100dmr5.html) - 传智播客--Jbpm(一)_hhl_bj_新浪博客
` -- API
ProcessInstance: 如何生成?
== 接受一个流程实例的参数;
== ProcessDefinition.createInstance();
-- 保存操作:基本上同
jbpmContext.save
-- 流程定义一定是从数据库中取出来的;
== jbpmContext.getGraphSession().findProcessDefinition(名字,版本);
== 可以不需要版本:默认为获取最后一个版本;
-- 所有的数据库操作都是与JbpmContext有关;
-- 获取Token(令牌),跳过start结点
pi.getRootToken().signal();
-- 本次流程所有的任务处理完之后,表中才有结束时间列表;
3. 获取任务列表;
-- API:
List<TaskInstance> taskList = jbpmContext.getTaskList(actorId);
TaskInstance: id, name, actorId, create, start, end
-- 这里指的是【获取所有未完成的任务】
首先可以获取员工张三的任务;任务完成后数据表中自动清除任务行内容;
然后是经理李四;
最后又是员工张三;
4. 启动任务;
-- API:
TaskInstance.start();
-- 获取TaskInstance:
jbpmContext.getTaskInstance(id);
5. 结束任务;
-- API:
TaskInstance.end();
-- 获取TaskInstance:
jbpmContext.getTaskInstance(id);
6. 异常处理:
回滚事务
jbpmContext.setRollBackOnly();
--------------
有关细节问题;
1. 部署问题:流程档案文件
(1) 保存在本地;zip
(2) 部署到应用中去;
------------------------------------------
(1) 必须有一个processdefinition.xml文件;
其他两个文件:
gpd.xml: 坐标文件;
processimage.jpg:图片文件;
(2) 实际的应用还有更多的的文件和业务逻辑等;
比如可以加入class文件;
(3) 将原有的流程定义部分使用Eclipse部署打包为firstPD.zip;
并把它放在first目录下;
ProcessDefinition.parseParResource("firstPD.zip");
2. 流程图
(1) 结点(node)
(2) 转换(transtion)
---------------------
一个节点有一个或多个转换;
如审批到领款或审批直接到结束;
有多个转换时需要指定名字;
多个转换,只会执行其中一个;
ti.end(); == 使用第一个
ti.end("to end"); == 关联上源码就可以知道参数的名字;
** 使用一个方法完成整个的流程;
-- 判断流程执行完毕的2种方法;
== pi.getEnd() != null;
== "end".equals(pi.getRootToken().getNode().getName());
** 单元测试完成上述判断
Assert.assertEquals("end", currentNodeName);
-- 获取任务列表:
pi.getTaskMgmtInstance().getTaskInstances().next();
pi.getTaskMgmtInstance().getUnfinishedTasks(pi.getRootToken());
-- 测试:指定名字的transtion;
3. 变量
-- 业务数据:报销金额
-- 与HttpSession原理一样;
ContextInstance = pi.getContextInstance();
ContextInstance: get/setVariable("money", 300);
if (money > 1000)
toend;
else
to领款;
-- 应用:
执行过程中关联业务数据,如报销金额;
可以设置当前登录用户的角色,配置文件的变量:如任务的actor-id:张三,李四;
== actor-id="#{employee}"; "#{manager}";
== 用到这个变量前需要设定值;设定的方法同上;
== 当执行到那个任务时,会自动使用get方法获取上述变量;
== 最晚在signal之前设定变量的值;
课堂实验;
-- 其他:log4j --
log4j.rootLogger=DEBUG/ERROR, CONSOLE
第一天的测试;
=========================================================================
1. 关于分步执行流程与数据表
a> 部署流程定义
表【jbpm_processdefinition】,【jbpm_task】
流程的定义(名字,描述)放在表【jbpm_processdefinition】中;
任务的定义放在表【jbpm_task】中;
每执行一次流程定义的代码,就在这2张表中多一套数据;他们之间有外键关联关系;但是实际测试超过2次后【jbpm_task】就不再多生成表数据;
【jbpm_processdefinition】通过版本列信息定义最新的版本;
b> 启动流程实例
表【jbpm_processinstance】,【jbpm_taskinstance】
表【jbpm_processinstance】中有实例的起始时间和结束时间;此时的起始时间为程序执行的时间,结束时间为空;
表【jbpm_taskinstance】中有关于每个任务的字段,但是第一次只有一行数据,也就是第一个任务;
c> 获取任务列表
d> 开始任务
e> 结束任务
2. 部署成zip
-------------------------------
1. 抽象出流程的UML图;
报销过程;
2. jpbl: 写一个xml文件
用来定义上述UML图;
3. 部署;
xml需要压缩为zip格式:processDefinition.zip;
不要放在中文的路径下;
4. jbpm提供了一个例子,直接部署即可看到效果;
JbpmDemo
--------------------
Process Definition
1. jbpm自己带了一个插件,可以完成
-- UML图;
-- 根据UML自动生成jbpl语言;
-- 不用再压缩成zip格式,而直接在Eclipse使用插件完成部署;
-- 插件自动将UML图保存为jpg图片后,在IE中可以直接看到这个uml流程图;
-- 每个流程,IE的webapp中可以定位到uml流程图的任务结点位置中;
----------------
练习: 使用插件完成这个WebApp
6.X
-------------------------
1.复制designer的路径名;
2. Eclipse/links:
jbpm-jpdl.link文件
path=path;内容
3. 重启MyEclipse;
4. 目录不要是中文,需要转移;
7.0
-----------------------------
1. pluginCon
2.cmd ->进入jar路径;
3. set classpath=pluginConfigInfo.jar
java cn.itcast.PluginConfigInfo "插件的目录"
提示信息;
4. 按照提示信息完成安装;
我的第一个Jbpm部署
----------------------------------------
1. 配置MyEclipse7.0,增加jboss jbpm插件;
java cn.itcast.PluginConfigInfo "你的插件路径"
根据控制台提示信息,完成; 重启MyEclipse即可;
2. 简单的报销工作流;
(1) Web App; (2) 新建:Jboss->Process Definition; 内容放在src中;
(3) 会自动生成:src/baoxiao: gpd.xml, processdefinition.xml, processimage.jpg(UML图画完后才有);
(4) 画UML图,自动生成xml语句;
(5) 启动JBOSS服务器:jboss: /server/start.bat
(6) 部署我的jbpm:MyEclipse->baoxiao: Deployment
(7) 进入主页查看:http://localhost:8080/jbpm-console
其他的细节:在课堂讲座的笔记已经有;
进一步:工程
------------------------------------------------------------
1. 新建lib文件夹,添加jar包;
2. 配置文件:
-- 包结构,源码文件夹与普通文件夹
-- src: java, process, config;
-- config/hibernate.cfg.xml : 创建数据库
/jbpm.cfg.xml
/jbpm.mail.templates.xml
log4j.properties;
** 一个方法:创建数据:使用单元测试;
3. 创建表:32张表;
编程实现:固定模式
---------------------------------------------------------------
deployProcessDefinition();
startProcessInstance();
getTaskList();
startTask();
endTask();
1. 部署流程定义:
-- 使用测试类
-- deployProcessDefinition();
-- 从文件到实体
jbpm: ProcessDefinition;
ProcessDefinition: parseXXX();
可以解析各种形式的实体描述;
如XmlString, XMLInputStream, XmlReader等等;
无论哪个方法,都是返回ProcessDefinition对象实体;
-- 从实体到数据库
不建议直接操作session, 如session.save(ProcessDefinition);
一定要使用jbpm的API:JbpmContext;
JbpmContext.deployProcessDefinition(ProcessDefinition);
如何获取JbpmContext对象?
JbpmConfiguration.getInstance().createJbpmContext();
这些核心的API类,与Hibernate相似;
这里的事务如何控制?
JbpmContext来控制;
createJbpmContext()打开事务;
JbpmContext.close()关闭事务;
-- 执行完毕,如何知道执行成功?
查看数据库;
-- 写这个方法注意:
JbpmConfiguration.getInstance(); --- 相当于Hibernate中的Configuration.configure()
如果不接收参数,代表classpath下的Hibernate.cfg.xml;
2. 启动流程实例;
-- 过程:
得到实体;保存进数据库;
来源:(http://blog.sina.com.cn/s/blog_5ecfe46a0100dmr5.html) - 传智播客--Jbpm(一)_hhl_bj_新浪博客
` -- API
ProcessInstance: 如何生成?
== 接受一个流程实例的参数;
== ProcessDefinition.createInstance();
-- 保存操作:基本上同
jbpmContext.save
-- 流程定义一定是从数据库中取出来的;
== jbpmContext.getGraphSession().findProcessDefinition(名字,版本);
== 可以不需要版本:默认为获取最后一个版本;
-- 所有的数据库操作都是与JbpmContext有关;
-- 获取Token(令牌),跳过start结点
pi.getRootToken().signal();
-- 本次流程所有的任务处理完之后,表中才有结束时间列表;
3. 获取任务列表;
-- API:
List<TaskInstance> taskList = jbpmContext.getTaskList(actorId);
TaskInstance: id, name, actorId, create, start, end
-- 这里指的是【获取所有未完成的任务】
首先可以获取员工张三的任务;任务完成后数据表中自动清除任务行内容;
然后是经理李四;
最后又是员工张三;
4. 启动任务;
-- API:
TaskInstance.start();
-- 获取TaskInstance:
jbpmContext.getTaskInstance(id);
5. 结束任务;
-- API:
TaskInstance.end();
-- 获取TaskInstance:
jbpmContext.getTaskInstance(id);
6. 异常处理:
回滚事务
jbpmContext.setRollBackOnly();
--------------
有关细节问题;
1. 部署问题:流程档案文件
(1) 保存在本地;zip
(2) 部署到应用中去;
------------------------------------------
(1) 必须有一个processdefinition.xml文件;
其他两个文件:
gpd.xml: 坐标文件;
processimage.jpg:图片文件;
(2) 实际的应用还有更多的的文件和业务逻辑等;
比如可以加入class文件;
(3) 将原有的流程定义部分使用Eclipse部署打包为firstPD.zip;
并把它放在first目录下;
ProcessDefinition.parseParResource("firstPD.zip");
2. 流程图
(1) 结点(node)
(2) 转换(transtion)
---------------------
一个节点有一个或多个转换;
如审批到领款或审批直接到结束;
有多个转换时需要指定名字;
多个转换,只会执行其中一个;
ti.end(); == 使用第一个
ti.end("to end"); == 关联上源码就可以知道参数的名字;
** 使用一个方法完成整个的流程;
-- 判断流程执行完毕的2种方法;
== pi.getEnd() != null;
== "end".equals(pi.getRootToken().getNode().getName());
** 单元测试完成上述判断
Assert.assertEquals("end", currentNodeName);
-- 获取任务列表:
pi.getTaskMgmtInstance().getTaskInstances().next();
pi.getTaskMgmtInstance().getUnfinishedTasks(pi.getRootToken());
-- 测试:指定名字的transtion;
3. 变量
-- 业务数据:报销金额
-- 与HttpSession原理一样;
ContextInstance = pi.getContextInstance();
ContextInstance: get/setVariable("money", 300);
if (money > 1000)
toend;
else
to领款;
-- 应用:
执行过程中关联业务数据,如报销金额;
可以设置当前登录用户的角色,配置文件的变量:如任务的actor-id:张三,李四;
== actor-id="#{employee}"; "#{manager}";
== 用到这个变量前需要设定值;设定的方法同上;
== 当执行到那个任务时,会自动使用get方法获取上述变量;
== 最晚在signal之前设定变量的值;
课堂实验;
-- 其他:log4j --
log4j.rootLogger=DEBUG/ERROR, CONSOLE
第一天的测试;
=========================================================================
1. 关于分步执行流程与数据表
a> 部署流程定义
表【jbpm_processdefinition】,【jbpm_task】
流程的定义(名字,描述)放在表【jbpm_processdefinition】中;
任务的定义放在表【jbpm_task】中;
每执行一次流程定义的代码,就在这2张表中多一套数据;他们之间有外键关联关系;但是实际测试超过2次后【jbpm_task】就不再多生成表数据;
【jbpm_processdefinition】通过版本列信息定义最新的版本;
b> 启动流程实例
表【jbpm_processinstance】,【jbpm_taskinstance】
表【jbpm_processinstance】中有实例的起始时间和结束时间;此时的起始时间为程序执行的时间,结束时间为空;
表【jbpm_taskinstance】中有关于每个任务的字段,但是第一次只有一行数据,也就是第一个任务;
c> 获取任务列表
d> 开始任务
e> 结束任务
2. 部署成zip