- 浏览: 448858 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
g_man1990:
update config 不成功啊
build-helper-maven-plugin 配置多 source resource 文件 -
netwelfare:
文章很详细,就是太长了,读起来有点困难,倒不如写精练点,像这篇 ...
Java 基本类型 -
huyuancai1010:
function commitForm() {
var ...
加时间戳或者随机数去除js缓存 -
Smile__:
不过这个东西以前还真没研究过 。
hibernate.jdbc.fetch_size 和 hibernate.jdbc.batch_size -
Smile__:
想不到你也是北大青鸟的 。哈
hibernate.jdbc.fetch_size 和 hibernate.jdbc.batch_size
代码说明:
在借款流程发起后,流程进入了申请单填写阶段。这个阶段是个人工的任务,需要用户的介入。因此,对于要借款的用户而言,首先是获取填写申请单的任务实例:
TaskInstance ti = (TaskInstance)pi.getTaskMgmtInstance().getTaskInstances().iterator() .next()
在这个测试类中,由于没有数据库。对流程实例的引用是依靠了类的全局标量pi。这里通过pi获取全部的任务列表。实际上有且仅有一个任务,就是我们刚刚发起的申请单填写任务。
接下来,我们获取流程的上下文变量,将申请借款的数额记录在上下文变量中ContextInstance ci = ti.getContextInstance();
ci.setVariable("money",new Integer(money));
最后,我们要结束当前任务,告诉流程继续下行,调用ti.end();这个方法的本质依然是调用了token.signal(),它选择了一个默认的transition进行转向。这里要说明的是signal方法有多态的实现signal(Transition transition),是可以指定具体转向参数的。
4. 部门领导审批申请
- /**
- * 部门经理审批
- * @param pass
- */
- @SuppressWarnings("unchecked")
- protected void approveByManager(boolean pass){
- System.out.println("==FirstFlowProcessTest.approveByManager()==");
- Iterator<TaskInstance> it = pi.getTaskMgmtInstance().getTaskInstances().iterator();
- for( ;it.hasNext(); ){
- TaskInstance ti = it.next();
- if(ti.getActorId().equals("DepartmentManager")){
- List<Transition> transitions = ti.getToken().getNode().getLeavingTransitions();
- for(Transition t : transitions){
- System.out.println("----Transition" + t.getName());
- }
- assertEquals("DepartmentManager",ti.getActorId());
- if(pass){
- ti.end("部门经理审批通过");
- }else{
- ti.end("部门经理驳回");
- }
- return;
- }
- }
- }
代码说明:
这里,流程进入了部门经理审批阶段。由于没有数据库支持,我们只能采取遍历任务列表,并比对委派者ID的方式来确定委派给部门经理的任务实例。(在后面的基于数据库的标准案例中,我们会看到如果根据用户的ID来获取分配给指定用户的任务)
ti.getActorId().equals("DepartmentManager") // 比对任务的委派人。
ti.getToken().getNode().getLeavingTransitions();//获取任务在当前节点上的所有转向。
这里我们要特别指出的是ti.end("部门经理审批通过")和ti.end("部门经理驳回")这实际上调用token.signal(transition);来完成任务的转向,从而使流程继续。
5. 总经理审批申请
- /**
- * 总经理审批
- * @param pass
- */
- @SuppressWarnings("unchecked")
- protected void approveByPresident(boolean pass){
- System.out.println("==FirstFlowProcessTest.approveByPresident()==");
- Iterator<TaskInstance> it = pi.getTaskMgmtInstance().getTaskInstances().iterator();
- for( ;it.hasNext(); ){
- TaskInstance ti = it.next();
- if(ti.getActorId().equals("President")){
- List<Transition> transitions = ti.getToken().getNode().getLeavingTransitions();
- for(Transition t : transitions){
- System.out.println("----Transition" + t.getName());
- }
- assertEquals("President",ti.getActorId());
- if(pass){
- ti.end("总经理审批通过");
- }else{
- ti.end("总经理驳回");
- }
- return;
- }
- }
- }
/** * 总经理审批 * @param pass */ @SuppressWarnings("unchecked") protected void approveByPresident(boolean pass){ System.out.println("==FirstFlowProcessTest.approveByPresident()=="); Iterator<TaskInstance> it = pi.getTaskMgmtInstance().getTaskInstances().iterator(); for( ;it.hasNext(); ){ TaskInstance ti = it.next(); if(ti.getActorId().equals("President")){ List<Transition> transitions = ti.getToken().getNode().getLeavingTransitions(); for(Transition t : transitions){ System.out.println("----Transition" + t.getName()); } assertEquals("President",ti.getActorId()); if(pass){ ti.end("总经理审批通过"); }else{ ti.end("总经理驳回"); } return; } } }
代码说明:
此步代码同“部门经理审批”代码相似,不作更多说明。
标准流程测试案例
该案例模拟了标准运行环境中,基于关系型数据库的jBPM系统是如何执行流程的。
测试案例类:FirstFlowProcessDBTest.java
- public class FirstFlowProcessDBTest {
- /*
- * 初始化jBPM配置
- * 包含对Hibernate的数据库初始化
- */
- static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
- public static void main(String[] args){
- FirstFlowProcessDBTest test = new FirstFlowProcessDBTest();
- test.test4000YuanApplication();
- test.test6000YuanApplication();
- test.test7000YuanApplication();
- }
- public void test4000YuanApplication(){
- ProcessInstance pi = createProcessInstance("linly");
- submitApplication("linly" , 4000);
- approveByManager(true);
- checkTasks(pi);
- }
- public void test6000YuanApplication() {
- ProcessInstance pi = createProcessInstance("linly");
- submitApplication("linly" , 6000);
- approveByManager(true);
- approveByPresident(true);
- checkTasks(pi);
- }
- public void test7000YuanApplication() {
- ProcessInstance pi = createProcessInstance("linly");
- submitApplication("linly" , 7000);
- approveByManager(true);
- approveByPresident(false);
- checkTasks(pi);
- }
- /**
- * 生成流程实例
- */
- protected ProcessInstance createProcessInstance(String user){
- System.out.println("==FirstFlowProcessTest.createProcessInstance()==");
- JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
- try {
- GraphSession graphSession = jbpmContext.getGraphSession();
- /*
- * 从数据库获取指定的流程定义
- */
- ProcessDefinition pdf = graphSession.findLatestProcessDefinition("simple");
- //生成流程实例
- ProcessInstance pi = pdf.createProcessInstance();
- //设置流程发起人
- pi.getContextInstance().createVariable("initiator", user);
- //触发流程转向
- pi.signal();
- /*
- * 保存流程实例
- */
- jbpmContext.save(pi);
- return pi;
- }finally{
- jbpmContext.close();
- }
- }
- /**
- * 填写提交申请单
- * @param money
- */
- @SuppressWarnings("unchecked")
- protected void submitApplication(String actorId , int money){
- System.out.println("==FirstFlowProcessTest.submitApplication()==");
- JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
- try {
- /*
- *根据操作者ID,获取属于该操作者的任务集
- */
- List<TaskInstance> taskInstances = jbpmContext.getTaskList(actorId);
- for(TaskInstance ti : taskInstances){
- System.out.println("ti.name = " + ti.getName());
- System.out.println("ti.actor = " + ti.getActorId());
- ContextInstance ci = ti.getContextInstance();
- ci.setVariable("money",new Integer(money));
- ti.end();
- }
- }finally{
- jbpmContext.close();
- }
- }
- /**
- * 部门经理审批
- * @param pass
- */
- @SuppressWarnings("unchecked")
- protected void approveByManager(boolean pass){
- System.out.println("==FirstFlowProcessTest.approveByManager()==");
- JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
- try{
- List<TaskInstance> taskInstances = jbpmContext.getTaskList("DepartmentManager");
- for(TaskInstance ti : taskInstances){
- System.out.println("ti.name = " + ti.getName());
- System.out.println("ti.actor = " + ti.getActorId());
- if(pass){
- ti.end("部门经理审批通过");
- }else{
- ti.end("部门经理驳回");
- }
- }
- }finally{
- jbpmContext.close();
- }
- }
- /**
- * 总经理审批
- * @param pass
- */
- @SuppressWarnings("unchecked")
- protected void approveByPresident(boolean pass){
- System.out.println("==FirstFlowProcessTest.approveByPresident()==");
- JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
- try{
- List<TaskInstance> taskInstances = jbpmContext.getTaskList("President");
- for(TaskInstance ti : taskInstances){
- System.out.println("ti.name = " + ti.getName());
- System.out.println("ti.actor = " + ti.getActorId());
- if(pass){
- ti.end("总经理审批通过");
- }else{
- ti.end("总经理驳回");
- }
- }
- }finally{
- jbpmContext.close();
- }
- }
- /**
- * 打印任务记录
- */
- @SuppressWarnings("unchecked")
- protected void checkTasks(ProcessInstance pi){
- System.out.println("==FirstFlowProcessTest.checkTasks()==");
- JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
- try{
- List<TaskInstance> coll = jbpmContext.getTaskMgmtSession().findTaskInstancesByProcessInstance(pi);
- System.out.println("====Process has task:====");
- for(TaskInstance ti : coll){
- System.out.println("=="+ti.getName()+"==");
- System.out.println("=="+ti.getActorId()+"==");
- System.out.println("=="+ti.getVariables().toString() +"==");
- }
- System.out.println("====end====");
- }finally{
- jbpmContext.close();
- }
- }
- }
public class FirstFlowProcessDBTest { /* * 初始化jBPM配置 * 包含对Hibernate的数据库初始化 */ static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance(); public static void main(String[] args){ FirstFlowProcessDBTest test = new FirstFlowProcessDBTest(); test.test4000YuanApplication(); test.test6000YuanApplication(); test.test7000YuanApplication(); } public void test4000YuanApplication(){ ProcessInstance pi = createProcessInstance("linly"); submitApplication("linly" , 4000); approveByManager(true); checkTasks(pi); } public void test6000YuanApplication() { ProcessInstance pi = createProcessInstance("linly"); submitApplication("linly" , 6000); approveByManager(true); approveByPresident(true); checkTasks(pi); } public void test7000YuanApplication() { ProcessInstance pi = createProcessInstance("linly"); submitApplication("linly" , 7000); approveByManager(true); approveByPresident(false); checkTasks(pi); } /** * 生成流程实例 */ protected ProcessInstance createProcessInstance(String user){ System.out.println("==FirstFlowProcessTest.createProcessInstance()=="); JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try { GraphSession graphSession = jbpmContext.getGraphSession(); /* * 从数据库获取指定的流程定义 */ ProcessDefinition pdf = graphSession.findLatestProcessDefinition("simple"); //生成流程实例 ProcessInstance pi = pdf.createProcessInstance(); //设置流程发起人 pi.getContextInstance().createVariable("initiator", user); //触发流程转向 pi.signal(); /* * 保存流程实例 */ jbpmContext.save(pi); return pi; }finally{ jbpmContext.close(); } } /** * 填写提交申请单 * @param money */ @SuppressWarnings("unchecked") protected void submitApplication(String actorId , int money){ System.out.println("==FirstFlowProcessTest.submitApplication()=="); JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try { /* *根据操作者ID,获取属于该操作者的任务集 */ List<TaskInstance> taskInstances = jbpmContext.getTaskList(actorId); for(TaskInstance ti : taskInstances){ System.out.println("ti.name = " + ti.getName()); System.out.println("ti.actor = " + ti.getActorId()); ContextInstance ci = ti.getContextInstance(); ci.setVariable("money",new Integer(money)); ti.end(); } }finally{ jbpmContext.close(); } } /** * 部门经理审批 * @param pass */ @SuppressWarnings("unchecked") protected void approveByManager(boolean pass){ System.out.println("==FirstFlowProcessTest.approveByManager()=="); JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try{ List<TaskInstance> taskInstances = jbpmContext.getTaskList("DepartmentManager"); for(TaskInstance ti : taskInstances){ System.out.println("ti.name = " + ti.getName()); System.out.println("ti.actor = " + ti.getActorId()); if(pass){ ti.end("部门经理审批通过"); }else{ ti.end("部门经理驳回"); } } }finally{ jbpmContext.close(); } } /** * 总经理审批 * @param pass */ @SuppressWarnings("unchecked") protected void approveByPresident(boolean pass){ System.out.println("==FirstFlowProcessTest.approveByPresident()=="); JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try{ List<TaskInstance> taskInstances = jbpmContext.getTaskList("President"); for(TaskInstance ti : taskInstances){ System.out.println("ti.name = " + ti.getName()); System.out.println("ti.actor = " + ti.getActorId()); if(pass){ ti.end("总经理审批通过"); }else{ ti.end("总经理驳回"); } } }finally{ jbpmContext.close(); } } /** * 打印任务记录 */ @SuppressWarnings("unchecked") protected void checkTasks(ProcessInstance pi){ System.out.println("==FirstFlowProcessTest.checkTasks()=="); JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try{ List<TaskInstance> coll = jbpmContext.getTaskMgmtSession().findTaskInstancesByProcessInstance(pi); System.out.println("====Process has task:===="); for(TaskInstance ti : coll){ System.out.println("=="+ti.getName()+"=="); System.out.println("=="+ti.getActorId()+"=="); System.out.println("=="+ti.getVariables().toString() +"=="); } System.out.println("====end===="); }finally{ jbpmContext.close(); } } }
相对于简单流程测试案例,标准流程的业务是相同的。它们的不同点在于:简单流程通过XML载入流程定义,并使用类的全局变量来保存流程实例的引用;而标准流程则是通过数据库载入流程定义,并使用数据库的会话来维护流程的运行。
1. 从数据库载入流程定义
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
从jBPM配置环境中获取jBPM上下文实例,jbpmContext是对jbpm持久层操作API及上下文环境的封装,它根据jBPM的配置文件生成。
GraphSession graphSession = jbpmContext.getGraphSession();
生成对流程图操作的持久层会话
ProcessDefinition pdf = graphSession.findLatestProcessDefinition("simple");
从数据库获取命名为“simple”的流程定义。
2. 新建流程实例,并存入数据库持久化
ProcessInstance pi = pdf.createProcessInstance();
根据流程定义生成实例。
pi.getContextInstance().createVariable("initiator", user); pi.signal();
设置实例的上下文变量,激活实例执行进程。
jbpmContext.save(pi);
保存实例到数据库,持久化实例。
3. 从数据库获取属于指定操作者的任务集
- JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
- try{
- List<TaskInstance> taskInstances = jbpmContext.getTaskList("DepartmentManager");
- for(TaskInstance ti : taskInstances){
- System.out.println("ti.name = " + ti.getName());
- System.out.println("ti.actor = " + ti.getActorId());
- if(pass){
- ti.end("部门经理审批通过");
- }else{
- ti.end("部门经理驳回");
- }
- }
- }finally{
- jbpmContext.close();
- }
通过JbpmContext对象,从数据库获取指定操作者的任务集合:
- List<TaskInstance> taskInstances = jbpmContext.getTaskList("DepartmentManager");
注意,在每次的JbpmContext对象使用完毕后,一定要执行jbpmContext.close(),其本质是要释放数据库的操作连接。
- FirstFlow样例代码.rar (85.9 KB)
- 下载次数: 115
相关推荐
在《jBPM-jPDL学习笔记——流程设计与控制》这篇博文中,作者主要介绍了如何使用jPDL进行流程设计和控制,包括以下几个关键知识点: 1. **jPDL介绍**: jPDL是jBPM的核心组成部分,它定义了流程实例的行为。通过...
jBPM-jPDL学习笔记——流程设计与控制.doc JBPM4.4之HelloWorld示例.doc jbpm4.4会签实例.doc jbpm4.4安装配置step by step.doc jbpm4自带数据库分析.doc jBPM_4教程PPT.pdf JBPM与SSH架构融合.doc 工作流模型...
通过jBPM-jPDL学习笔记,你可以系统地学习如何使用jPDL设计和实施业务流程,掌握jbpm的核心概念和技术。无论是对于开发人员还是业务分析师,这份资料都将极大地提升你在工作流管理领域的专业技能。
在安装配置方面,"jBPM-jPDL学习笔记—框架设计简介.doc"和"jBPM-JPDL v3.2环境部署——发布到Tomcat + MySQL.doc"将是你的重要参考资料。这两个文档详细介绍了如何搭建jBPM开发环境,包括下载和安装jBPM工具,配置...