公文类:
package com.wlh.jbpm;
public class Document {
private int id;
private String title;
private String content;
private String creator;
private Long processInstanceId;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getCreator() {
return creator;
}
public void setCreator(String creator) {
this.creator = creator;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Long getProcessInstanceId() {
return processInstanceId;
}
public void setProcessInstanceId(Long processInstanceId) {
this.processInstanceId = processInstanceId;
}
}
映射文件:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class table="T_Document" name="com.wlh.jbpm.Document">
<id name="id">
<generator class="native"/>
</id>
<property name="title"/>
<property name="content"/>
<property name="creator"/>
<property name="processInstanceId"/>
</class>
</hibernate-mapping>
在hibernate.cfg.xml中添加该映射文件
<mapping resource="com/wlh/jbpm/Document.hbm.xml"/>
HibernateUtils工具类:
package com.wlh.jbpm;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {
private static SessionFactory sessionFactory;
static{
Configuration conf = new Configuration().configure();
sessionFactory = conf.buildSessionFactory();
}
public static SessionFactory getSessionFactory(){
return sessionFactory;
}
public static Session getSession(){
return sessionFactory.openSession();
}
public static void closeSession(Session session){
if(session.isOpen()){
session.close();
}
}
}
通过图形界面在src/main/jpdl下创建一个流程定义Process Definition:
注意:要在每个任务节点task-node 之间加入task标签(此过程就是给节点分配参与者)
<?xml version="1.0" encoding="UTF-8"?>
<process-definition
xmlns="" name="jbpm01">
<start-state name="start">
<transition name="" to="张一审批"></transition>
</start-state>
<task-node name="张一审批">
<task>
<assignment actor-id="张一"/>
</task>
<transition name="" to="张二审批"></transition>
</task-node>
<task-node name="张二审批">
<task>
<assignment actor-id="张二"/>
</task>
<transition name="" to="张三审批"></transition>
</task-node>
<task-node name="张三审批">
<task>
<assignment actor-id="张三"/>
</task>
<transition name="" to="end1"></transition>
</task-node>
<end-state name="end1"></end-state>
</process-definition>
使用jbpm的API创建jbpm的相关数据库表:
a.数据库链接配置修改为MySQL的配置:
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://127.0.0.1/jbpm</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">bjsxt</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
b.确保src/main/config下的hibernate.cfg.xml中的数据库配置和当前的数据库对应,
如果没创建数据库,则先创建数据库和url中配置的数据库名称对应:此处为jbpm.
<property name="hibernate.connection.url">jdbc:hsqldb:mem:jbpm</property>
package com.wlh.jbpm;
import org.jbpm.JbpmConfiguration;
import junit.framework.TestCase;
.
// 使用jbpm的API,创建JBPM的数据库表格,也可以使用hibernate.hbm2ddl.auto
public void testCreateTable(){
JbpmConfiguration.getInstance().createSchema();
}
}
部署流程定义:
package com.wlh.jbpm;
import junit.framework.TestCase;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.ProcessDefinition;
public class Jbpm02_DeployProcessDefinition extends TestCase {
static JbpmConfiguration jbpmConfiguration=JbpmConfiguration.getInstance();
//将流程定义的信息持久化到JBPM数据库表
public void testDeployDefinitionProcess(){
//根据流程定义文件,创建ProcessDefinition对象
ProcessDefinition processDefinition=ProcessDefinition.parseXmlResource("jbpm01/processdefinition.xml");
//context对象类似于hibernate session对象的功能,它封装了hibernate session
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try{
//将流程定义持久化到数据库
jbpmContext.deployProcessDefinition(processDefinition);
}catch(Exception e){
//出现异常后回滚
jbpmContext.setRollbackOnly();
}finally{
jbpmContext.close();
}
}
}
创建一个对应刚刚创建流程定义的流程实例,
此过程流程实例和公文相互绑定:
package com.wlh.jbpm;
import junit.framework.TestCase;
import org.hibernate.Session;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
public class Jbpm04_CreateProcessInstance extends TestCase {
static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
public void testCreateProcessInstance(){
JbpmContext context = jbpmConfiguration.createJbpmContext();
try{
context.setSessionFactory(HibernateUtils.getSessionFactory());
//从数据库中加载ProcessDefinition对象
ProcessDefinition processDefinition=context.getGraphSession().findLatestProcessDefinition("jbpm01");
//从流程定义对象中创建流程实例
ProcessInstance processInstance=new ProcessInstance(processDefinition);
//持久化流程实例对象
context.save(processInstance);
Session session=context.getSession();
//流程实例绑定到公文对象
Document doc=(Document) session.load(Document.class, 4);
doc.setProcessInstanceId(processInstance.getId());
//公文对象绑定到流程实例
processInstance.getContextInstance().setVariable("documentId", doc.getId());
processInstance.getContextInstance().setVariable("documentTitle", doc.getTitle());
}catch(Exception e){
context.setRollbackOnly();
}finally{
context.close();
}
}
}
提交公文:
package com.wlh.jbpm;
import junit.framework.TestCase;
import org.hibernate.Session;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.exe.ProcessInstance;
public class Jbpm05_SubmitDocument extends TestCase {
static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
//将公文提交到第一个节点
public void testSubmitDocument(){
JbpmContext context = jbpmConfiguration.createJbpmContext();
try{
context.setSessionFactory(HibernateUtils.getSessionFactory());
Document doc=(Document) context.getSession().load(Document.class, 4);
long processInstanceId=doc.getProcessInstanceId();
ProcessInstance instance=context.getProcessInstance(processInstanceId);
//触发流程流向下一个节点
instance.signal();
}catch(Exception e){
e.printStackTrace();
context.setRollbackOnly();
}finally{
context.close();
}
}
}
得到公文在流程中当前所在节点:
package com.wlh.jbpm;
import junit.framework.TestCase;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.exe.ProcessInstance;
public class Jbpm06_CurrentNode extends TestCase{
static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
//获得公文当前所处的节点
public void testCurrentNode(){
JbpmContext context = jbpmConfiguration.createJbpmContext();
try{
context.setSessionFactory(HibernateUtils.getSessionFactory());
Document doc = (Document)context.getSession().load(Document.class, 4);
long processInstanceId = doc.getProcessInstanceId();
ProcessInstance instance = context.getProcessInstance(processInstanceId);
System.out.println("当前节点名称="+instance.getRootToken().getNode().getName());
//断言的作用?方便了自动化测试,如果instance.getRootToken().getNode().getName()得到的值不是"张二审批",则会抛出异常;
//this.assertEquals(instance.getRootToken().getNode().getName(),"张二审批" );
}catch(Exception e){
e.printStackTrace();
context.setRollbackOnly();
}finally{
context.close();
}
}
}
查询流动到某个参与者手上的公文列表:
package com.wlh.jbpm;
import java.util.Iterator;
import java.util.List;
import junit.framework.TestCase;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.taskmgmt.exe.TaskInstance;
public class Jbpm07_SearchMyTaskList extends TestCase {
static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
//查询流动到某个参与者手上的公文列表【即待审公文列表】
public void testSearchMyTaskList(){
JbpmContext context = jbpmConfiguration.createJbpmContext();
try{
context.setSessionFactory(HibernateUtils.getSessionFactory());
printTask(context,"张一");
printTask(context,"张二");
printTask(context,"张三");
}catch(Exception e){
e.printStackTrace();
context.setRollbackOnly();
}finally{
context.close();
}
}
private void printTask(JbpmContext context,String actorId){
//得到某个参与者(参与者对应节点)的所有任务实例,任务实例是流程实例流到某个节点(节点对应参与者)而产生的
List taskInstances = context.getTaskMgmtSession().findTaskInstances(actorId);
for (Iterator iter = taskInstances.iterator(); iter.hasNext();) {
TaskInstance taskInstance = (TaskInstance) iter.next();
//得到某个任务实例所在的流程实例,然后从流程实例中拿到变量的信息(对应公文信息,这里拿到的是公文的id和title)
//为什么能拿到公文的信息呢?因为版本Jbpm04_CreateProcessInstance.java中已经将公文绑定到流程实例中了
Integer docId = (Integer)taskInstance.getProcessInstance().getContextInstance().getVariable("documentId");
String title = (String)taskInstance.getProcessInstance().getContextInstance().getVariable("documentTitle");
System.out.println("正在等待【"+actorId+"】审批的公文是:[title="+title+",id="+docId+"]");
}
}
}
触发流程流转到下一个节点:
package com.wlh.jbpm;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Session;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.taskmgmt.exe.TaskInstance;
import junit.framework.TestCase;
public class Jbpm08_NextNode extends TestCase {
static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
//触发流程流转到下一个节点
public void testFlowToNextNode(){
JbpmContext context = jbpmConfiguration.createJbpmContext();
try{
context.setSessionFactory(HibernateUtils.getSessionFactory());
nextStep(context,"张二",4);//将张二待审公文流转到下一个节点
}catch(Exception e){
e.printStackTrace();
context.setRollbackOnly();
}finally{
context.close();
}
}
/**
* 将某个参与者手上的某个公文提交到下一个步骤
* @param context
* @param actorId 参与者id
* @param docId 公文id
*/
private void nextStep(JbpmContext context,String actorId,Integer docId){
//得到某个参与者(参与者对应节点)的所有任务实例,任务实例是流程实例流到某个节点(节点对应参与者)而产生的
List taskInstances = context.getTaskMgmtSession().findTaskInstances(actorId);
for (Iterator iter = taskInstances.iterator(); iter.hasNext();) {
TaskInstance taskInstance = (TaskInstance) iter.next();
//
//得到某个任务实例所在的流程实例,然后从流程实例中拿到变量的信息(对应公文信息,这里拿到的是公文的id和title)
//为什么能拿到公文的信息呢?因为版本Jbpm04_CreateProcessInstance.java中已经将公文绑定到流程实例中了
Integer oldDocId = (Integer)taskInstance.getProcessInstance().getContextInstance().getVariable("documentId");
String title = (String)taskInstance.getProcessInstance().getContextInstance().getVariable("documentTitle");
if(oldDocId.equals(docId)){
//参与者的审批任务已经完成,需要结束任务实例
//在默认的情况下,也能够触发流程流向下一个节点
taskInstance.end();//结束任务实例
System.err.println("公文[title="+title+",id="+docId+"]已经被【"+actorId+"】审批完成,已提交到下一个节点");
}
}
}
}
分享到:
相关推荐
【jbpm4 web设计器的初步方案】主要探讨的是如何利用jbpm4框架构建一个基于Web的流程设计工具。jbPM(Java Business Process Management)是一个开源的业务流程管理系统,它允许开发者设计、执行和管理业务流程。这...
通过以上步骤,你已成功完成了jbpm的初步安装和配置,可以开始探索和使用jbpm进行业务流程管理。在后续的学习中,你将更深入地了解jbpm的工作原理,如何创建和管理流程,以及如何与其他技术如Spring、Hibernate集成...
标题 "jbpm源码阅读之一" 提到的是对jbpm(Java Business Process Management)源代码的初步探索。jbpm是一个开源的工作流管理系统,它提供了一套完整的框架来处理业务流程,包括流程定义、执行和监控。这篇博客文章...
通过这些文档的学习,你应该能够建立起对jBPM的全面认识,并具备初步的开发能力。记住,实践是检验理论的最好方式,所以不仅要阅读文档,还要动手编写代码,模拟实际场景,这样才能更好地理解和运用jBPM。
这份文档提供了一个初步理解JBPM部署和配置的指南,以及如何处理起始任务。对于想要使用JBPM的人来说,它是学习和操作这个工作流引擎的基础。为了进一步使用和优化,读者还需要掌握更多的JBPM特性,如泳道...
**JBPM4.4入门详解** JBPM,全称Java Business Process Management...通过实践这个简单的jsp+servlet例子,你将能够初步掌握如何在实际应用中使用JBPM。在学习过程中,不断探索和实践,逐步提升你的业务流程管理能力。
2. **部门审批**:部门经理对申请进行初步审核,确认费用的合理性和合规性。 3. **财务审核**:财务部门对申请进行财务核算,检查发票和凭证的真实性。 4. **总经理审批**:对于金额较大的报销,可能需要总经理的...
描述中提到的"jboss getting start 官方手册"可能是指JBoss BPM平台的入门指南,通常这样的手册会涵盖如何安装、配置和初步使用JBPM,包括创建流程定义、部署流程和服务集成等内容。虽然该手册并未直接提供在压缩包...
### JBPM环境搭建与初步体验 #### 一、前言 JBPM(JBoss Business Process Management)是一款开源的业务流程管理引擎,它基于Java技术,能够支持多种业务流程建模语言,例如BPMN2.0。JBPM不仅提供了一个强大的...
完成初步的流程设计后,进行多轮测试以确保流程的正确性和效率。根据实际需求进行调整,比如增加审批层级、设置请假天数限制等。 总的来说,"简单的jbpm请假流程"涵盖了从流程设计、实现到运行的整个过程,它展示...
1. **jbpm简介**:介绍jbpm的基本概念、设计哲学和适用场景,帮助初学者建立对jbpm的初步认识。 2. **安装与配置**:详述如何在开发环境中设置jbpm,包括下载、构建、依赖管理和配置步骤。 3. **流程定义**:解释...
通过这三集视频的学习,观众将能深入理解JBPM 4.4的核心功能,并具备初步的流程设计和实施能力。对于希望提升企业流程管理水平,或对业务流程自动化感兴趣的开发者和管理人员来说,这是一份宝贵的学习资源。
"HelloWorld"是学习任何新技术时的经典入门示例,Jbpm HelloWorld则是对Jbpm基础功能的初步探索。 在这个项目中,我们将深入理解Jbpm的核心概念和组件,以及如何通过编写简单的代码来实现一个工作流实例。Jbpm的...
《JBoss jBPM入门与实践》 一、引言:深入理解JBoss jBPM JBoss jBPM(jBusiness Process Management)是JBoss家族中的一个开源工作流引擎,用于实现业务流程管理(BPM)解决方案。它提供了一套完整的工具集,包括...
本篇文章将对JBPM进行初步分析,着重探讨其核心概念、功能特性以及如何使用。 1. **核心概念** - **工作流(Workflow)**:工作流是一系列相互关联的任务,通过预定义的顺序进行协调,以完成一个业务过程。 - **...
在本项目中,"FirstFlow"可能就是用BPMN设计的一个初步的借款申请流程。 接下来,我们关注Spring的角色。Spring作为基础架构层,将负责初始化jbPM环境,包括设置数据源、流程引擎、工作内存等。同时,Spring的依赖...
例如,当客户申请贷款时,系统会根据预设的工作流规则,自动将请求分发给相应的柜员进行初步审核,然后递交给信贷部门进行进一步评估,最后由风险控制部门决定是否批准贷款。整个过程无需人工干预,提高了效率,减少...
完成以上步骤后,你的开发环境初步搭建完成,可以在新建的工程中创建Process Definition文件。 jBPM指南的第一章介绍了jBPM的基本概念,包括其灵活性、可扩展性,以及如何通过直观的流程设计语言来图形化表示业务...