`
ynztpwl
  • 浏览: 59498 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jbpm——api介绍

 
阅读更多
创建一个事务,jbpm都是在一个事务中完成的

JbpmContext jbpmContext =
JbpmConfiguration.getInstance().createJbpmContext();

----中间写点东西

jbpmContext.close();

我们其实可以在web.xml里面配置一个选项,那么我们就不用创建流程和关闭流程了
也就是
JbpmContext jc = JbpmConfiguration.getInstance().getCurrentJbpmContext();
代替 :
JbpmContext jc = JbpmConfiguration.getInstance().createJbpmContext();

<servlet>
<servlet-name>CloseJbpmConfigurationServlet</servlet-name>
<servlet-class>org.jbpm.web.CloseJbpmConfigurationServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<filter>
<filter-name>JbpmContextFilter</filter-name>
<filter-class>org.jbpm.web.JbpmContextFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>JbpmContextFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>

注意:loadTaskInstance和loadProcessInstance 的工作其实可以调用
jbpmContext.loadTaskInstance(123);
jbpmContext.loadProcessInstance(123);
jbpmContext.save(processInstance);
他会去委托相应的session来完成

-----------Session--------------------------------------------------------------
Session , GraphSession , TaskMgmtSession

GraphSession graphSession = jbpmContext.getGraphSession();
Session session = jbpmContext.getSession();
其中GraphSession对于维护Jbpm的表,因为jbpm的xml对我们来说就是一个图(至少eclipse中是)
而Session是管理jbpm以外的表的

所以graphSession可以部署流程定义(其实就是save到jbpm的表里面嘛)
graphSession.deployProcessDefinition(processDefinition);//部署流程定义,如果已经存在同名的定义,则版本号会自动累加
graphSession.loadProcessDefinition(processDefinitionId);
graphSession.findLastestProcessDefinition("xxx");
graphSession.saveProcessDefinition(pd);
而session可以增删改查普通数据表
session.save(qingjiaForm);
session.load(QingjiaForm.class,Long.parseLong(id));

TaskMgmtSession tackMgmtSession = jbpmContext.getTaskMgmtSession();
这个session是用来和jbpm数据库表中的与工作相关的东西打交道的

//只能获取尚未完成的任务列表
//得到这个用户的所有taskInstance,这个userId就是assigment里面的actor-id
List list = taskMgmtSession.findTaskInstance(userId);
TaskInstance taskInstance = taskMgmtSession.loadTaskInstance(id);



---------------ProcessDefinition----------------------------------------------------------
ProcessDefinition这个对象是拥有xml信息的对象
从文件中拿到
ProcessDefinition processDefinition =
ProcessDefinition.parseXmlResource("org/ministone/training/jbpm/processdefinition.xml");
ProcessDefinition pd =
ProcessDefinition.parseParZipInputStream(new ZipInputStream(file.getInputStream()));
从数据库中拿到
ProcessDefinition processDefinition =
graphSession.loadProcessDefinition(processDefinitionId);
ProcessDefinition processDefinition =
graphSession.findLastestProcessDefinition("xxx");
从字符串中拿到
ProcessDefinition processDefinition =
ProcessDefinition.parseXmlString("<xxxx><xxx>xx<xxx>");

pd.getFileDefinition().getBytes(String name); //这个是从数据库中获取文件的字节流,需要传入文件的名字
Map bytesMap = pd.getFileDefinition().getBytesMap();//得到每一个文件
ZipOutputStream zipOutputStream
= new ZipOutputStream(resp.getOutputStream());
for(Iterator it=bytesMap.keySet().iterator();it.hasNext();){
String fname = (String)it.next();
byte[] filebytes = fd.getBytes(fname);
ZipEntry zipEntry = new ZipEntry(fname); //创建一个zip文件入口
zipOutputStream.putNextEntry(zipEntry);//使得入口和outputStream相连
zipOutputStream.write(fileBytes);
zipOutputStream.closeEntry();
}
zipOutputStream.finish();
zipOutputStream.flush();
zipOutputStream.close();


------------------ProcessInstance---------------------------------------------------------------
ProcessInstance是根据processDefinition给new出来的,他相当于xml的动态部分,
也就是有状态的ProcessInstance

ProcessInstance processInstance =
new ProcessInstance(processDefinition);
jbpmContext.save(processInstance); //一般是在开始加载流程的时候弄


--------------taskInstance-----------------------------------------
if(taskInstance.getStart()==null)
taskInstance.start(); //标识一个任务的执行开始:任务的开始时间被填充,看成提交申请
//taskInstance.end();//任务结束时间被填充,下一个节点的初始化,前一个任务的结束和下一个节点的开始在一个事物内,可以看成事审批申请
jbpmContext.save(taskInstance);//记住:驱动完成之后还要save


--------------------创建数据库---------------------------------------
JbpmConfiguration.getInstance().createSchema(); //创建数据库

JbpmConfiguration.getInstance().dropSchema();

pi.signal(); 与 ti.end()的区别

联系: 他们都是调用了rootToken.signal()方法,
区别: ti.end()里面有这样一段代码
this.end = Clock.getCurrentTime(); //这个是对时间做了处理
而我们取代办任务列表的时候List list = taskMgmtSession.findTaskInstance(userId);
他的依据是if(end == null){获取}他不管流程的位置的

-----------------xml----------------------------------------------------
<process-definition name="qingjia" >
<start-state name="start-state1">
<transition to="fillform"></transition>
</start-state >
<task-node name="fillform">
<task name="fill form">
<assignment actor-id="1"></assignment> //这种形式,那么这个工作fill form只固定这一个人来处理
</task>
<transition to="mgr audit"></transition>
</task-node>
<task-node name="mgr audit">
<task name="mgr audit">
<assignment actor-id="2"></assignment> //这种形式,那么这个工作fill form只固定这一个人来处理
</task>
<transition to="end-state"></transition>
</task-node>
<end-state name="end-state"></end-state>
</process-definition>


流程角色 swimlane
<swimlane name="starter">
<assignment actor-id="1"/>
</swimlane>
然后
<task name="fill form">
<assignment actor-id="1"></assignment> //这种形式,那么这个工作fill form只固定这一个人来处理
</task>
就可以变成
<task name="fill form" swimlane="starter">
</task>

用变量传递参与者id
<task-node name="collectform">
<task>
<assignment class="com.zwz.UserIdAssigmentHandler" /> ---通过这个类和上一个参数来动态加载这个actor-id
<assignment actor-id="#{userid}"/>
</task>
<transition name="auditfork" to="auditfork" />
</task-node>

Handler 实现
public class UserIdAssigmentHandler implements AssignmentHandler{
public void assign(Assignable assignable,ExecutionContext executionContext){
// String actorid = (String)executionContext.getVariable("userid");
String currentActorId = (String)executionContext.getProcessInstance().getContextInstance().getVariable("currentId");
//先得到当前的id,然后再通过业务逻辑,找到相应的处理者,然后设置进去
assignable.setActorId(this.getRealActorId(currentActorId)); //把我们需要的actor-id放进去

}
}

String currentActorId = (String)executionContext.getProcessInstance().getContextInstance().getVariable("currentId");
这一句依赖于上一个页面有:
taskInstance.getProcessInstance().getContextInstance().setVariable("currentId","34");

<task>
<assignment actor-id="#{userid}"/>
</task>
这样也可以
但是在到达这个tack前需要设置
pi.getContextInstance().setVariable("userid",xxx);
这样的话,assignement的执行者就会被自动赋值上


List list = ti.getTask().getTaskNode().getLeavingTransitions();
这个可以得到TaskNode的所有trans,因为有时候会有多个trans

-----------------------------------------------------------------------
--------------节点介绍-----------------------------------
start-state 这个节点可以指定task 但是不能指定task里面的actor
public TaskInstance createStartTaskInstance()
{
TaskInstance taskInstance = null;
Task startTask = taskMgmtDefinition.getStartTask();
if(startTask != null)
{
Token rootToken = processInstance.getRootToken();
ExecutionContext executionContext = new ExecutionContext(rootToken);
taskInstance = createTaskInstance(startTask, executionContext);
taskInstance.setActorId(SecurityHelper.getAuthenticatedActorId()); //这里actorId被覆盖了
}
return taskInstance;
}
那么如何设置这个被认证过的id呢?
jbpmContext.setActorId((String)session.getAttribute("actorId"));
TaskInstance ti = pi.getTaskMgmtInstance().createStartTaskInstance();//这里就得到了在start里面的任务
ti.start();
ti.end(); //一般第一个start节点就是做些初始化准备工作,所以连续的start,end

在start-state里面还可以指定swimlane,而且这个swimlane都不用写assigment,因为这个任务的执行者也是通过set进去的
<swimlane name="starter"></swimlane> 这样就可以直接用
<start-state name="start-state1">
<task name="填申请单" swimlane="starter" ></task>
<transition to="fillform"></transition>
</start-state >


---------------------------------------------
jbpm.cfg.xml
<jbpm-configuration>
<string name="jbpm.files.dir" value="d:/" /> ---这个配置意思是把流程定义存到指定的目录下面而不是数据库中
</jbpm-configuration>

分享到:
评论

相关推荐

    传智播客OA+工作流实战_工作流中的概念与JBPM相关API调用

    在本课程“传智播客OA+工作流实战_工作流中的概念与JBPM相关API调用”中,我们将深入探讨工作流管理系统的基石——工作流的概念,以及如何利用JBPM这一流行的工作流引擎进行API调用以实现业务流程自动化。...

    jBPM-jPDL学习笔记——流程设计与控制(转载)

    《jBPM-jPDL学习笔记——流程设计与控制》 在IT行业中,流程管理和自动化是企业提升效率的关键。jBPM(Java Business Process Management)是一个开源的工作流和业务流程管理套件,它允许开发者通过定义流程定义...

    jbpm-3.1.2.zip_jbpm_jbpm 3.1.2_jbpm-3.1.2.rar_jbpm3.1.2_工作流

    jbpm-3.1.2.zip 文件包含了 jBpm 的一个重要版本——jBpm 3.1.2,这是一个开源的工作流管理系统,专为构建灵活且可扩展的业务流程解决方案而设计。jBpm 提供了一种方式,使得开发者能够用简单而强大的语言来表达业务...

    jbpm实战讲解.pdf

    - 提供了一个具体案例——借款申请流程,深入讲解了JBPM服务API的调用,帮助理解实际应用场景。 **1.5 不同服务的详细介绍与全流程演示** - 细致解析了JBPM中的各种服务及其功能,同时展示了如何通过这些服务...

    jbpm学习资料,jbpm教程

    本资料主要围绕jbpm的核心组件——jPDL进行讲解,帮助学习者深入理解jbpm的工作原理和应用。 jPDL(jBPM Process Definition Language)是jbpm使用的一种基于XML的语言,用于描述业务流程。它提供了一系列的元素和...

    jbpm jar java

    【jbpm jar java】——深入理解jbpm与Java的整合应用 jbpm,全称是JBoss Business Process Management,是一款开源的工作流管理系统,主要用于处理业务流程的建模、执行和监控。jbpm的设计目标是提供一个灵活且强大...

    jBPM-JPDL v3.2环境部署——发布到Tomcat + MySQL

    本文将详细介绍如何在Windows 2003环境下,使用SUN JDK1.6U4、Tomcat6.0.14和MySQL 6.0部署jBPM-JPDL v3.2。 **1. 系统准备** 确保操作系统为Windows 2003,并安装SUN JDK1.6U4。安装JDK后,需设置`JAVA_HOME`环境...

    JBPM4工作流应用开始指南.rar

    第一篇介绍工作流管理技术的概念、起源和发展历程,开源工作流选型,以及jBPM——这个迄今为止最成功的Java开源工作流项目的“前世今生”。此外,本篇还可以帮助读者快速上手jBPM4、使用jBPM4开发企业流程应用,包括...

    jBPM 4使用手记

    jBPM 4提供了一个图形化的流程建模工具——jBPM Designer,通过它可以使用BPMN 2.0语言创建流程模型。设计师允许用户拖放活动、事件、网关等元素,实现流程的可视化设计,同时支持导出为XML格式的流程定义文件(....

    JBPM-----PPT

    **JBPM——工作流管理系统详解** JBPM,全称Java Business Process Management,是一个开源的工作流管理系统,用于管理和执行业务流程。这个PPT集合提供了一套完整的教程,旨在帮助用户快速理解并掌握JBPM的核心...

    JBPM.rar_java开发

    **JBPM——基于Java的企业流程管理** JBPM(JBoss Business Process Management)是Red Hat公司提供的一个开源工作流和业务流程管理系统,它专注于提供企业级的业务流程自动化能力。JBPM以其灵活、可扩展和易集成的...

    jBPM 3.2 最新学习文档

    首先,我们要理解jBPM的核心概念——工作流引擎。工作流引擎是jBPM的灵魂,它负责管理和执行定义好的业务流程。在jBPM 3.2中,工作流引擎具有高度的可扩展性和灵活性,支持各种工作流模型,如顺序流程、并行分支和...

    JBPM4.4例子

    - **部署流程定义**: 使用jbpm-tools工具或API导入BPMN流程定义文件(.bpmn2)。 - **编写servlet**: 创建servlet来启动流程实例、查询任务列表、完成任务等。 - **设计jsp页面**: 设计用户交互界面,显示任务列表,...

    JBPM案例详解(三)

    在本案例中,我们将主要关注如何使用JBPM实现一个具体的业务流程——“LeaveSchoolWorkflow_03”,这个流程可能代表学生退学申请的处理过程。 首先,理解JBPM的核心概念至关重要。JBPM提供了工作流引擎,它可以解析...

    jbpm实例开发

    接下来,我们讨论数据库示例,这是jbPM的一个重要特性——流程实例的持久化。jbPM支持在流程等待状态时将执行信息存储到数据库,以便后续继续执行。在示例中,创建流程实例后,可以将其保存到数据库,同时可以设置上...

    jbpm书

    jbpm的核心在于其灵活的流程定义语言——Business Process Definition Language (BPMN 2.0),使得非技术人员也能理解并创建复杂的业务流程。 文档《jBPM开发入门指南.doc》通常会涵盖jbpm的基本概念、环境搭建、...

    我自己写的jbpm小例子

    【jbpm初级学习小示例】是一个非常适合初学者入门的工作流引擎——jbpm的实践项目。jbpm,全称为Java Business Process Management,是一款开源的、基于Java的企业业务流程管理(BPM)系统,它提供了全面的工作流...

    JBPM实例讲解+源码+视图+流程

    ### JBPM工作流实例——报销申请详解 #### 一、JBPM简介 JBPM(Java Business Process Model)是一个开源的工作流引擎,它基于Java技术,主要用于实现业务流程管理(BPM)。JBPM允许开发者轻松地定义复杂的业务流程...

    JBPM4使用小结.doc

    下面是对 JBPM4 的主要 API 介绍和使用。 ProcessEngine ProcessEngine 是 JBPM4 的流程引擎,是整个系统的核心部分。它提供了对流程的管理和执行。可以通过 Configuration 类获取 ProcessEngine 对象,...

    JBPM.rar_jbpm

    JBPM作为一个强大的BPM解决方案,允许开发者和业务分析师使用统一的工作流语言——Business Process Model and Notation (BPMN)来设计流程,并将其转化为可执行的代码。 **JBPM的内部原理** JBPM的架构主要包括...

Global site tag (gtag.js) - Google Analytics