jbpm3.2简单实例

JBPM 简单示例实现 一/准备工作: 1.引入JBPM相关JAR包  - 引入Hibernate依赖包  - 引入JBPM依赖包   * bsh.jar   * jcr-1.0.jar   * jbpm-identity.jar   * jbpm-jpdl.jar  - 引入数据库驱动   * mysql-connector-java-3.1.13-bin.jar 2.定义相关配置文件  - Hi 阅读详情


jpdl文件:

<?xml version="1.0" encoding="UTF-8"?>

<process-definition
  xmlns="urn:jbpm.org:jpdl-3.2"  name="firstdoc">
   <start-state name="startFirstdoc">
      <transition name="提交给sam初审" to="sam审批"></transition>
   </start-state>
   <task-node name="sam审批">
   	  <task name="初审请假单">
   	  	<assignment actor-id="sam2011" />
   	  </task>
      <transition name="提交给lam核实" to="lam审批"></transition>
   </task-node>
   <task-node name="lam审批">
   	  <task name="核实请假单">
   	  	<assignment actor-id="lam2011" />
   	  </task>
      <transition name="提交给evan批准" to="evan审批"></transition>
   </task-node>
   <task-node name="evan审批">
   	  <task name="批准请假单">
   	  	<assignment actor-id="eavn2011" />
   	  </task>
      <transition name="完成审批" to="endFirstdoc"></transition>
   </task-node>
   <end-state name="endFirstdoc"></end-state>
</process-definition>
图片:

hibernate配置文件:

<?xml version='1.0' encoding='utf-8'?>

<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
  <session-factory>

    <!-- hibernate dialect -->
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

    <!-- JDBC connection properties (begin) -->
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/jbpmsam</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">admin</property>
    <!-- JDBC connection properties (end) -->
    
    <property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
    
     <property name="hibernate.hbm2ddl.auto">update</property>
    
    <mapping resource="com/rs/model/Document.hbm.xml" />
    <!-- DataSource properties (begin) ===
    <property name="hibernate.connection.datasource">java:/JbpmDS</property>
    ==== DataSource properties (end) -->
    
    <!-- JTA transaction properties (begin) ===
    <property name="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property>
    <property name="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup</property>
    ==== JTA transaction properties (end) -->

    <!-- CMT transaction properties (begin) ===
    <property name="hibernate.transaction.factory_class">org.hibernate.transaction.CMTTransactionFactory</property>
    <property name="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup</property>
    ==== CMT transaction properties (end) -->

    <!-- logging properties (begin) ===
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.format_sql">true</property>
    <property name="hibernate.use_sql_comments">true</property>
    ==== logging properties (end) -->
    
    <!-- ############################################ -->
    <!-- # mapping files with external dependencies # -->
    <!-- ############################################ -->

    <!-- following mapping file has a dependendy on   -->
    <!-- 'bsh-{version}.jar'.                         -->
    <!-- uncomment this if you don't have bsh on your -->
    <!-- classpath.  you won't be able to use the     -->
    <!-- script element in process definition files   -->
    <mapping resource="org/jbpm/graph/action/Script.hbm.xml"/>

    <!-- following mapping files have a dependendy on  -->
    <!-- 'jbpm-identity.jar', mapping files            -->
    <!-- of the pluggable jbpm identity component.     -->
    <!-- Uncomment the following 3 lines if you        -->
    <!-- want to use the jBPM identity mgmgt           -->
    <!-- component.                                    -->
    <!-- identity mappings (begin) -->
    <mapping resource="org/jbpm/identity/User.hbm.xml"/>
    <mapping resource="org/jbpm/identity/Group.hbm.xml"/>
    <mapping resource="org/jbpm/identity/Membership.hbm.xml"/>
    <!-- identity mappings (end) -->
    
    <!-- following mapping files have a dependendy on  -->
    <!-- the JCR API                                   -->
    <!-- jcr mappings (begin) ===
    <mapping resource="org/jbpm/context/exe/variableinstance/JcrNodeInstance.hbm.xml"/>
    ==== jcr mappings (end) -->


    <!-- ###################### -->
    <!-- # jbpm mapping files # -->
    <!-- ###################### -->

    <!-- hql queries and type defs -->
    <mapping resource="org/jbpm/db/hibernate.queries.hbm.xml" />
    
    <!-- graph.def mapping files -->
    <mapping resource="org/jbpm/graph/def/ProcessDefinition.hbm.xml"/>
    <mapping resource="org/jbpm/graph/def/Node.hbm.xml"/>
    <mapping resource="org/jbpm/graph/def/Transition.hbm.xml"/>
    <mapping resource="org/jbpm/graph/def/Event.hbm.xml"/>
    <mapping resource="org/jbpm/graph/def/Action.hbm.xml"/>
    <mapping resource="org/jbpm/graph/def/SuperState.hbm.xml"/>
    <mapping resource="org/jbpm/graph/def/ExceptionHandler.hbm.xml"/>
    <mapping resource="org/jbpm/instantiation/Delegation.hbm.xml"/>

    <!-- graph.node mapping files -->
    <mapping resource="org/jbpm/graph/node/StartState.hbm.xml"/>
    <mapping resource="org/jbpm/graph/node/EndState.hbm.xml"/>
    <mapping resource="org/jbpm/graph/node/ProcessState.hbm.xml"/>
    <mapping resource="org/jbpm/graph/node/Decision.hbm.xml"/>
    <mapping resource="org/jbpm/graph/node/Fork.hbm.xml"/>
    <mapping resource="org/jbpm/graph/node/Join.hbm.xml"/>
    <mapping resource="org/jbpm/graph/node/State.hbm.xml"/>
    <mapping resource="org/jbpm/graph/node/TaskNode.hbm.xml"/>

    <!-- context.def mapping files -->
    <mapping resource="org/jbpm/context/def/ContextDefinition.hbm.xml"/>
    <mapping resource="org/jbpm/context/def/VariableAccess.hbm.xml"/>

    <!-- taskmgmt.def mapping files -->
    <mapping resource="org/jbpm/taskmgmt/def/TaskMgmtDefinition.hbm.xml"/>
    <mapping resource="org/jbpm/taskmgmt/def/Swimlane.hbm.xml"/>
    <mapping resource="org/jbpm/taskmgmt/def/Task.hbm.xml"/>
    <mapping resource="org/jbpm/taskmgmt/def/TaskController.hbm.xml"/>

    <!-- module.def mapping files -->
    <mapping resource="org/jbpm/module/def/ModuleDefinition.hbm.xml"/>

    <!-- bytes mapping files -->
    <mapping resource="org/jbpm/bytes/ByteArray.hbm.xml"/>

    <!-- file.def mapping files -->
    <mapping resource="org/jbpm/file/def/FileDefinition.hbm.xml"/>

    <!-- scheduler.def mapping files -->
    <mapping resource="org/jbpm/scheduler/def/CreateTimerAction.hbm.xml"/>
    <mapping resource="org/jbpm/scheduler/def/CancelTimerAction.hbm.xml"/>

    <!-- graph.exe mapping files -->
    <mapping resource="org/jbpm/graph/exe/Comment.hbm.xml"/>
    <mapping resource="org/jbpm/graph/exe/ProcessInstance.hbm.xml"/>
    <mapping resource="org/jbpm/graph/exe/Token.hbm.xml"/>
    <mapping resource="org/jbpm/graph/exe/RuntimeAction.hbm.xml"/>

    <!-- module.exe mapping files -->
    <mapping resource="org/jbpm/module/exe/ModuleInstance.hbm.xml"/>
        
    <!-- context.exe mapping files -->
    <mapping resource="org/jbpm/context/exe/ContextInstance.hbm.xml"/>
    <mapping resource="org/jbpm/context/exe/TokenVariableMap.hbm.xml"/>
    <mapping resource="org/jbpm/context/exe/VariableInstance.hbm.xml"/>
    <mapping resource="org/jbpm/context/exe/variableinstance/ByteArrayInstance.hbm.xml"/>
    <mapping resource="org/jbpm/context/exe/variableinstance/DateInstance.hbm.xml"/>
    <mapping resource="org/jbpm/context/exe/variableinstance/DoubleInstance.hbm.xml"/>
    <mapping resource="org/jbpm/context/exe/variableinstance/HibernateLongInstance.hbm.xml"/>
    <mapping resource="org/jbpm/context/exe/variableinstance/HibernateStringInstance.hbm.xml"/>
    <mapping resource="org/jbpm/context/exe/variableinstance/LongInstance.hbm.xml"/>
    <mapping resource="org/jbpm/context/exe/variableinstance/NullInstance.hbm.xml"/>
    <mapping resource="org/jbpm/context/exe/variableinstance/StringInstance.hbm.xml"/>

    <!-- job mapping files -->
    <mapping resource="org/jbpm/job/Job.hbm.xml"/>
    <mapping resource="org/jbpm/job/Timer.hbm.xml"/>
    <mapping resource="org/jbpm/job/ExecuteNodeJob.hbm.xml"/>
    <mapping resource="org/jbpm/job/ExecuteActionJob.hbm.xml"/>

    <!-- taskmgmt.exe mapping files -->
    <mapping resource="org/jbpm/taskmgmt/exe/TaskMgmtInstance.hbm.xml"/>
    <mapping resource="org/jbpm/taskmgmt/exe/TaskInstance.hbm.xml"/>
    <mapping resource="org/jbpm/taskmgmt/exe/PooledActor.hbm.xml"/>
    <mapping resource="org/jbpm/taskmgmt/exe/SwimlaneInstance.hbm.xml"/>

    <!-- logging mapping files -->
    <mapping resource="org/jbpm/logging/log/ProcessLog.hbm.xml"/>
    <mapping resource="org/jbpm/logging/log/MessageLog.hbm.xml"/>
    <mapping resource="org/jbpm/logging/log/CompositeLog.hbm.xml"/>
    <mapping resource="org/jbpm/graph/log/ActionLog.hbm.xml"/>
    <mapping resource="org/jbpm/graph/log/NodeLog.hbm.xml"/>
    <mapping resource="org/jbpm/graph/log/ProcessInstanceCreateLog.hbm.xml"/>
    <mapping resource="org/jbpm/graph/log/ProcessInstanceEndLog.hbm.xml"/>
    <mapping resource="org/jbpm/graph/log/ProcessStateLog.hbm.xml"/>
    <mapping resource="org/jbpm/graph/log/SignalLog.hbm.xml"/>
    <mapping resource="org/jbpm/graph/log/TokenCreateLog.hbm.xml"/>
    <mapping resource="org/jbpm/graph/log/TokenEndLog.hbm.xml"/>
    <mapping resource="org/jbpm/graph/log/TransitionLog.hbm.xml"/>
    <mapping resource="org/jbpm/context/log/VariableLog.hbm.xml"/>
    <mapping resource="org/jbpm/context/log/VariableCreateLog.hbm.xml"/>
    <mapping resource="org/jbpm/context/log/VariableDeleteLog.hbm.xml"/>
    <mapping resource="org/jbpm/context/log/VariableUpdateLog.hbm.xml"/>
    <mapping resource="org/jbpm/context/log/variableinstance/ByteArrayUpdateLog.hbm.xml"/>
    <mapping resource="org/jbpm/context/log/variableinstance/DateUpdateLog.hbm.xml"/>
    <mapping resource="org/jbpm/context/log/variableinstance/DoubleUpdateLog.hbm.xml"/>
    <mapping resource="org/jbpm/context/log/variableinstance/HibernateLongUpdateLog.hbm.xml"/>
    <mapping resource="org/jbpm/context/log/variableinstance/HibernateStringUpdateLog.hbm.xml"/>
    <mapping resource="org/jbpm/context/log/variableinstance/LongUpdateLog.hbm.xml"/>
    <mapping resource="org/jbpm/context/log/variableinstance/StringUpdateLog.hbm.xml"/>
    <mapping resource="org/jbpm/taskmgmt/log/TaskLog.hbm.xml"/>
    <mapping resource="org/jbpm/taskmgmt/log/TaskCreateLog.hbm.xml"/>
    <mapping resource="org/jbpm/taskmgmt/log/TaskAssignLog.hbm.xml"/>
    <mapping resource="org/jbpm/taskmgmt/log/TaskEndLog.hbm.xml"/>
    <mapping resource="org/jbpm/taskmgmt/log/SwimlaneLog.hbm.xml"/>
    <mapping resource="org/jbpm/taskmgmt/log/SwimlaneCreateLog.hbm.xml"/>
    <mapping resource="org/jbpm/taskmgmt/log/SwimlaneAssignLog.hbm.xml"/>
    
  </session-factory>
</hibernate-configuration>

model类:

package com.rs.model;


public class Document{

	private int id;
	private String title;
	private String content;
	private long processInstanceId;
	
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public long getProcessInstanceId() {
		return processInstanceId;
	}
	public void setProcessInstanceId(long processInstanceId) {
		this.processInstanceId = processInstanceId;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
}

model对应的配置表:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.rs.model.Document" table="T_Document" >
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="title" />
        <property name="content" />
        <property name="processInstanceId" />
    </class>
</hibernate-mapping>

数据库管理类,创建数据库表:

package com.rs.jbpm;

import org.jbpm.JbpmConfiguration;

import junit.framework.TestCase;

public class JbpmDatabase extends TestCase {

	/**
	 * 创建数据库表
	 */
	public void testCreateDB() {
		JbpmConfiguration.getInstance().createSchema();
	}
}

jbpm例子:

package com.rs.jbpm;

import java.util.Iterator;
import java.util.List;
import java.util.Random;

import junit.framework.TestCase;

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 com.rs.model.Document;

public class JbpmTools extends TestCase {

	static JbpmConfiguration jbpmConfig = JbpmConfiguration.getInstance();
	//	JbpmContext对象封装了hibernate session 对象的功能,可以执行与数据库持久化相关的操作
	static JbpmContext jcontext = jbpmConfig.createJbpmContext();
	
	/**
	 * 部署流程定义:根据流程定义,解释得到流程定义对象,把流程定义持久化到数据库
	 */
	public void testDeployProcessDefinition() {
		//读取流程定义文件,得到流程定义对象
		ProcessDefinition pdef = ProcessDefinition.parseXmlResource("firstdoc/processdefinition.xml");
		try {
			jcontext.deployProcessDefinition(pdef);
		} catch (Exception e) {
			e.printStackTrace();
			jcontext.setRollbackOnly();//抛异常时,执行回滚;
		} finally {
			jcontext.close();//关闭流程
		}		
	}
	
	/**
	 * 创建公文,流程实例
	 */
	public void testCreateDocument() {
		try {
			//创建公文对象
			Document doc = new Document();
			int rd = new Random().nextInt(10000);
			doc.setTitle("公文编号" + rd);
			doc.setContent("这是地球上第"+rd+"号红色文件!");
			
			jcontext.getSession().save(doc);
			
			//创建流程实例
			//1.从数据库加载ProcessDefinition对象,GraphSession流程操作API
			ProcessDefinition pdef = jcontext.getGraphSession().findLatestProcessDefinition("firstdoc");
			
			//2.创建流程实例对象
			ProcessInstance instance = new ProcessInstance(pdef);
			jcontext.save(instance);
			
			//3.公文对象和流程实例对象绑定
			doc.setProcessInstanceId(instance.getId());
			instance.getContextInstance().setVariable("docId", new Integer(doc.getId()));
			
		} catch(Exception e) {
			e.printStackTrace();
			jcontext.setRollbackOnly();//抛异常时,执行回滚;
		} finally {
			jcontext.close();
		}
	}
	
	/**
	 * 提交公文
	 */
	public void testSubmitDocument() {
		try {
			//获取公文id
			int docId = 2;
			Document doc = (Document)jcontext.getSession().load(Document.class, new Integer(docId));
			//得到公文流程实例
			long processInstanceId = doc.getProcessInstanceId();
			ProcessInstance instance = jcontext.getProcessInstance(processInstanceId);
			
			//只能执行一次,提交到下一节点
			instance.signal();
		} catch(Exception e) {
			e.printStackTrace();
			jcontext.setRollbackOnly();//抛异常时,执行回滚;
		} finally {
			jcontext.close();
		}
	}
	
	/**
	 * 当前节点
	 */
	public void testCurrentNode() {
		try {
			//获取公文id
			int docId = 2;
			Document doc = (Document)jcontext.getSession().load(Document.class, new Integer(docId));
			//得到公文流程实例
			long processInstanceId = doc.getProcessInstanceId();
			ProcessInstance instance = jcontext.getProcessInstance(processInstanceId);
			
			System.err.println("公文 < Title:" + doc.getTitle() + "| Content: '" + doc.getContent() + "' >所处位置: " + instance.getRootToken().getNode().getName());
		} catch(Exception e) {
			e.printStackTrace();
			jcontext.setRollbackOnly();//抛异常时,执行回滚;
		} finally {
			jcontext.close();
		}
	}
	
	/**
	 * 查询用户的任务
	 */
	public void testTastList() {
		try {
			//已知用户
			printTask(jcontext, "sam2011");
			printTask(jcontext, "lam2011");
			printTask(jcontext, "eavn2011");
		} catch(Exception e) {
			e.printStackTrace();
			jcontext.setRollbackOnly();//抛异常时,执行回滚;
		} finally {
			jcontext.close();
		}
	}
	
	private void printTask(JbpmContext jc, String uid) {
		List tasks = jc.getTaskMgmtSession().findTaskInstances(uid);
		for(Iterator iter = tasks.iterator(); iter.hasNext();) {
			TaskInstance ti = (TaskInstance) iter.next();
			Integer docId = new Integer(ti.getProcessInstance().getContextInstance().getVariable("docId").toString());
			Document doc = (Document)jcontext.getSession().load(Document.class, docId);
			System.err.println("公文 < Title:" + doc.getTitle() + "| Content: '" + doc.getContent() + "' > 对应用户: " + uid);
		}
	}
	
	/**
	 * 提交任务
	 */
	public void testNextNode() {
		try {
			//已知用户
			int docId = 2;
			//nextNode(jcontext, "sam2011", docId);
			//nextNode(jcontext, "lam2011", docId);
			nextNode(jcontext, "eavn2011", docId);
		} catch(Exception e) {
			e.printStackTrace();
			jcontext.setRollbackOnly();//抛异常时,执行回滚;
		} finally {
			jcontext.close();
		}
	}
	
	private void nextNode(JbpmContext jc, String uid, int dId) {
		List tasks = jc.getTaskMgmtSession().findTaskInstances(uid);
		for(Iterator iter = tasks.iterator(); iter.hasNext();) {
			TaskInstance ti = (TaskInstance) iter.next();
			Integer docId = new Integer(ti.getProcessInstance().getContextInstance().getVariable("docId").toString());
			if(docId.equals(new Integer(dId))) {
				ti.end();//结束这个任务实例;触发对应的Token的signal()方法,即流向下一个环节
				Document doc = (Document)jcontext.getSession().load(Document.class, docId);
				System.err.println("公文 < Title:" + doc.getTitle() + "| Content: '" + doc.getContent() + "' > 已被用户: " + uid + "处理,提交到下一个环节");
			}
		}
	}
}

******************************************************************************************************************************

加入暂存类Persistence.java:

package com.rs.jbpm;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

public class Persistence {//辅助类--暂存器

	private static Map variables = null;
	//默认的临时文件路径
	private static String temFile = System.getProperty("java.io.tmpdir") + "/temp.object";
	
	static {//加载文件
		try {
			if(new File(temFile).exists()) {
				FileInputStream fis = new FileInputStream(temFile);
				ObjectInputStream ois = new ObjectInputStream(fis);
				variables = (Map)ois.readObject();
			}
			if(variables == null) {
				variables = new HashMap();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 设置变量值
	 * @param name
	 * @param obj
	 */
	public static void setVariable(String name, Object obj) {
		if(variables != null) {
			variables.put(name, obj);
		}
		try {
			FileOutputStream fos = new FileOutputStream(temFile);
			ObjectOutputStream oos = new ObjectOutputStream(fos);
			oos.writeObject(variables);
			oos.flush();
			oos.close();
			fos.flush();
			fos.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 获取变量值
	 * @param name
	 * @return Serializable
	 */
	public static Serializable getVariable(String name) {
		if(variables != null) {
			return (Serializable)variables.get(name);
		}
		return null;
	}
}
JbpmTools.java改为:

package com.rs.jbpm;

import java.util.Iterator;
import java.util.List;
import java.util.Random;

import junit.framework.TestCase;

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 com.rs.model.Document;

public class JbpmTools extends TestCase {

	static JbpmConfiguration jbpmConfig = JbpmConfiguration.getInstance();
	//	JbpmContext对象封装了hibernate session 对象的功能,可以执行与数据库持久化相关的操作
	static JbpmContext jcontext = jbpmConfig.createJbpmContext();
	
	/**
	 * 部署流程定义:根据流程定义,解释得到流程定义对象,把流程定义持久化到数据库
	 */
	public void testDeployProcessDefinition() {
		//读取流程定义文件,得到流程定义对象
		ProcessDefinition pdef = ProcessDefinition.parseXmlResource("firstdoc/processdefinition.xml");
		
		Persistence.setVariable("pdName", pdef.getName());//暂存‘流程定义’的名称
		try {
			jcontext.deployProcessDefinition(pdef);
		} catch (Exception e) {
			e.printStackTrace();
			jcontext.setRollbackOnly();//抛异常时,执行回滚;
		} finally {
			jcontext.close();//关闭流程
		}		
	}
	
	/**
	 * 创建公文,流程实例
	 */
	public void testCreateDocument() {
		try {
			//创建公文对象
			Document doc = new Document();
			int rd = new Random().nextInt(10000);
			doc.setTitle("公文编号" + rd);
			doc.setContent("这是地球上第"+rd+"号红色文件!");
			
			jcontext.getSession().save(doc);
			
			Persistence.setVariable("docId", new Integer(doc.getId()));//暂存‘公文’id
			
			//创建流程实例
			//1.从数据库加载ProcessDefinition对象,GraphSession流程操作API
			String pdName = (String)Persistence.getVariable("pdName");//从暂存读出
			ProcessDefinition pdef = jcontext.getGraphSession().findLatestProcessDefinition(pdName);
			
			//2.创建流程实例对象
			ProcessInstance instance = new ProcessInstance(pdef);
			jcontext.save(instance);
			
			//3.公文对象和流程实例对象绑定
			doc.setProcessInstanceId(instance.getId());
			instance.getContextInstance().setVariable("docId", new Integer(doc.getId()));
			
		} catch(Exception e) {
			e.printStackTrace();
			jcontext.setRollbackOnly();//抛异常时,执行回滚;
		} finally {
			jcontext.close();
		}
	}
	
	/**
	 * 提交公文
	 */
	public void testSubmitDocument() {
		try {
			//获取公文id
			Integer docId = (Integer)Persistence.getVariable("docId");
			Document doc = (Document)jcontext.getSession().load(Document.class, docId);
			//得到公文流程实例
			long processInstanceId = doc.getProcessInstanceId();
			ProcessInstance instance = jcontext.getProcessInstance(processInstanceId);
			
			//只能执行一次,提交到下一节点
			instance.signal();
		} catch(Exception e) {
			e.printStackTrace();
			jcontext.setRollbackOnly();//抛异常时,执行回滚;
		} finally {
			jcontext.close();
		}
	}
	
	/**
	 * 当前节点
	 */
	public void testCurrentNode() {
		try {
			//获取公文id
			Integer docId = (Integer)Persistence.getVariable("docId");
			Document doc = (Document)jcontext.getSession().load(Document.class, docId);
			//得到公文流程实例
			long processInstanceId = doc.getProcessInstanceId();
			ProcessInstance instance = jcontext.getProcessInstance(processInstanceId);
			
			System.err.println("公文 < Title:" + doc.getTitle() + "| Content: '" + doc.getContent() + "' >所处位置: " + instance.getRootToken().getNode().getName());
		} catch(Exception e) {
			e.printStackTrace();
			jcontext.setRollbackOnly();//抛异常时,执行回滚;
		} finally {
			jcontext.close();
		}
	}
	
	/**
	 * 查询用户的任务
	 */
	public void testTastList() {
		try {
			//已知用户
			printTask(jcontext, "sam2011");
			printTask(jcontext, "lam2011");
			printTask(jcontext, "eavn2011");
		} catch(Exception e) {
			e.printStackTrace();
			jcontext.setRollbackOnly();//抛异常时,执行回滚;
		} finally {
			jcontext.close();
		}
	}
	
	private void printTask(JbpmContext jc, String uid) {
		List tasks = jc.getTaskMgmtSession().findTaskInstances(uid);
		for(Iterator iter = tasks.iterator(); iter.hasNext();) {
			TaskInstance ti = (TaskInstance) iter.next();
			Integer docId = new Integer(ti.getProcessInstance().getContextInstance().getVariable("docId").toString());
			Document doc = (Document)jcontext.getSession().load(Document.class, docId);
			System.err.println("公文 < Title:" + doc.getTitle() + "| Content: '" + doc.getContent() + "' > 对应用户: " + uid);
		}
	}
	
	/**
	 * 提交任务
	 */
	public void testNextNode() {
		try {
			//已知用户
			Integer docId = (Integer)Persistence.getVariable("docId");
			//nextNode(jcontext, "sam2011", docId);
			//nextNode(jcontext, "lam2011", docId);
			nextNode(jcontext, "eavn2011", docId);
		} catch(Exception e) {
			e.printStackTrace();
			jcontext.setRollbackOnly();//抛异常时,执行回滚;
		} finally {
			jcontext.close();
		}
	}
	
	private void nextNode(JbpmContext jc, String uid, Integer dId) {
		List tasks = jc.getTaskMgmtSession().findTaskInstances(uid);
		for(Iterator iter = tasks.iterator(); iter.hasNext();) {
			TaskInstance ti = (TaskInstance) iter.next();
			Integer docId = new Integer(ti.getProcessInstance().getContextInstance().getVariable("docId").toString());
			if(docId.equals(dId)) {
				ti.end();//结束这个任务实例;触发对应的Token的signal()方法,即流向下一个环节
				Document doc = (Document)jcontext.getSession().load(Document.class, docId);
				System.err.println("公文 < Title:" + doc.getTitle() + "| Content: '" + doc.getContent() + "' > 已被用户: " + uid + "处理,提交到下一个环节");
			}
		}
	}
}




jbpm jbpm3 jbpm4 用户和开发指南+教程+最佳实践全套 jbpm3,jbpm4用户文档,开发指南,jbpm4解读,jbpm学习笔记,jbpm最佳实践全套套 立即下载

相关推荐

jbpm3基本资料和代码总结

对jbpm3的资料总结!详细的介绍每个变量,希望对你有用!

jbpm3概览

前段时间选用JBPM来做为未来项目的工作流引擎,JBPM的版本目前主要是3,4,5,因为4在很多时候有BUG,并且 官方的的documentation也是不推荐的,所以没有去看4的一些相关信息,版本5中的内容比较新,融入的东西也比较多,特别是对BPMN标准的支持,但是因为内容过多,学习的曲线度也比较大,所以从tom研发的JBPM3着手,3,4,5的三个版本几乎是完全不一样的,不可能完全的掌握,...

jonlee123的专栏 450

JBPM-3.2.2

jbpm-jpdl-suite-3.2.2.zip 3.2版本画流程图包 jbpm-jpdl-suite-3.2.2.zip 3.2版本画流程图包

纵观jBPM从jBPM3到jBPM5以及Activiti

今年最大的事件莫过于jBPM的创建者Tom Baeyens离开JBoss了。Tom Baeyens离开的具体原因尚不清楚,但他的离开产生了两个结果:一是jBPM的下一个版本jBPM5完全放弃了jBPM4的基础代码,基于Drools Flow重头来过;二是Tom Baeyens加入A......

818

若依框架-实现管理端与用户端的不同页面布局

我们现在要做的是:管理员登录时展示后台管理端,普通用户登录时展示我们自己写的页面。所以我们可以用v-if来判断登录用户的角色,如果用户角色包含admin,说明是管理员,渲染管理端相关组件,否则渲染用户端组件。不过若依作者的本意还是想退出系统后清空角色信息,所以为了保险期间,我们可以在退出系统后,延迟2秒,再单独清空角色信息。当我们登录管理端后,再退出登录,会有那么一瞬间渲染用户页面,然后才是回到登录界面。这个时候,前端检测到角色信息为空,不包含admin,于是就会渲染用户页面。用来延迟 2 秒执行。

m0_74462339的博客 1564

VBA一键汇总多个工作簿-名称相同的工作表-的指定区域数据

VBA一键汇总多个工作簿-名称相同的工作表-的指定区域数据 日常工作,我们经常需要汇总相同格式的工作簿的某个工作表的数据 如1月业绩、2月业绩。。。。12月业绩等 姓名 数量 数据22 22 数据23 23 数据24 24 数据25 25 数据26 26 数据27 27 数据28 28 数据29 29 数据30 30 数据31 31 数据32 32 数据33 33 数据34

陈表达的博客 5981

Jbpm3.2新手介绍

Java Business Process Management jBpm 是一个功能强大的可扩展的工作流管理系统。jBPM在2004年10月18日,发布了2.0版本,并在同一天加入了JBoss,成为了JBoss企业中间件平台的一个组成部分,它的名称也改成JBoss jBPM。随着jBPM加入JBoss组织,jBPM也将进入一个全新的发展时代,它的前景是十分光明的。jBpm用流程语言来表示商业流程...

jjjsss2的专栏 271

OpenClaw与Ollama本地AI部署指南

AI模型本地化部署是当前企业数字化转型的关键技术,通过开源框架Ollama可以在消费级硬件上运行大语言模型。本文以OpenClaw多智能体系统为例,详解从环境配置到模型优化的全流程实践,特别针对国内开发者遇到的网络问题提供了镜像加速等解决方案。这种私有化部署方案尤其适合金融数据分析、企业知识管理等对数据安全要求高的场景,通过模块化设计实现多智能体协作,同时保持对NVIDIA显卡和普通CPU的兼容性。

weixin_34302561的博客 396

摘录:学习JBPM工作流

&lt;script type="text/javascript"&gt;writeStars(0, "784005");&lt;/script&gt; 注册于: 13/02/2007 00:00:00 帖子总数: 6...

tang_java 233

20 CVPR Learning 3D Semantic Scene Graphs From 3D Indoor Reconstructions 学习笔记

3RScan是大规模真实世界的室内场景,特点是对478个自然改变的室内环境在不同的时间帧进行了1482 RGB-D scans,每一个scene都包括了一些位置被改变的物体。它和ScanNet数据集的区别主要在于ScanNet中的每一个采样环境都不相同,但是3RScan中存在采样环境相同但物体的位置不同的场景。Scene Graph Annotations 则是在3RScan的基础上给物体加入了场景图需要的关系、物体特征和类别标注,同时对3RScan进行了扩展,以此形成了场景图数据。

weixin_43508459的博客 1834

STM32+OpenCV云台PID调参实战:从震荡到丝滑跟踪的进阶之路

本文详细介绍了基于STM32和OpenCV的跟踪云台PID调参实战经验。从硬件搭建、PID控制原理到调参技巧,系统讲解了如何通过调整比例、积分和微分参数解决系统震荡问题,实现从震荡到丝滑跟踪的进阶过程,特别适合电赛和嵌入式视觉控制开发者参考。

tgb3456789的博客 715

jbpm3

JBPM学习笔记   2012-01-05 14:06:00|  分类: JBPM |字号 订阅 一、如何在MyEclipse中安装JBPM插件 1、环境 系统:Win7 MyEclipse版本:7.5/8.0 Jbpm版本:4.4 2、步骤 ①到jboss官网下载JBPM4.4,网址:http://sourceforge.net/projects/jbpm/files/ ...

LIXG425的专栏 494

Tiff、jpg图片怎么样添加地理坐标信息

Tiff、jpg图片怎么样添加地理坐标信息 一般,外业调查只有地图资料,如专题图、或者地形图,如何把这些地图资料的扫描地图带上坐标信息,从而内业实现信息化处理?以上问题,可以解决,但根据不同情况有不同的处理方法。     第一种,上面有经纬度外框,图片是矩形,但是没有地理信息。 通过图框的两个角的坐标确定范围,分别是左上(140°E,30°N);右下(150°W,30°N) 解决方

树木_xzw的博客 2万+

看到一个比较好的jbpm教程,感谢一下

family168 jbpm4.0下的例子,至少能跑起来。http://code.google.com/p/family168/downloads/list我用的是myeclipse7.5+eclipse3.4.2建的是web工程,稍改动一下就可以。哈哈 我运行的实例:http://download.csdn.net/source/1691966 转载于:https://www.cnblogs.c...

weixin_30241919的博客 61

人工智能在文学领域的应用:创作无限可能的智能作家

人工智能在文学领域的应用:创作无限可能的智能作家 作者:禅与计算机程序设计艺术 1. 背景介绍 人工智能技术近年来飞速发展,在各个领域都有广泛应用。文学创作作为人类最高级的智力活动之一,也逐渐受到人工智能技术的影响和改变。随着自然语言处理、生成式模型等人工智能

AI天才研究院 1109

【人脸识别】基于 Gabor+SVM和PCA+SVM实现人脸识别matlab源码含 GUI

1 简介 随着经济的快速发展,互联网的普及,信息安全逐渐被人们所重视。人脸识别技术作为保护信息安全的重要手段之一,也逐渐被研究学者所重视。人脸识别作为计算机视觉技术和生物特征识别技术的一个重要分支,模式识别与人工智能的一个重要领域,其主要任务是对静态图像或动态视频进行识别。如何快速的正确的对人脸进行识别是目前人脸识别课题的一个难题。人脸识别算法的选取直接关系到人脸识别的识别率。 本文首先介绍了国内外人脸识别的发展现状,并对人脸图像预处理方法进行了详细阐述。图像预处理的方法有很多,主要包括:灰度变换、图像锐

qq_59747472的博客 1135

jbpm 入门实例(3)——数据库表创建

针对前面第二课所遇到的问题,最后我的解决方案是换为下载jbpm-jpdl-suite-3.2.3.zip解压在E:/software目录下,它包含也包含了所有的东西,重复上面JBPM与eclipse的环境搭建的配置,拷贝E:/software/jbpm-jpdl-3.2.3/designer/eclipse中features和plugins目录,把里面的文件全部拷贝到eclipse安装程序中相

baggio0111的专栏 993

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Jbpm 一个简单的会签实例

一个简单的会签实例 作者:tomkoo以下例子中 采用了jbpm console 的几个实例用户 项目提交人 : ernie .主管审批 : bert会签 : ernie , bert , grover老板审批 : grover 正常流程: 项目金额 >= 500W RMB提交项目 --> 主管审批 --> 会签 --> 老板审批 --> 审批通过(结束)正

慧龙的Blog 2173

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

jbpm3.2 总结

Java Business Process Management jBpm 是一个功能强大的可扩展的工作流管理系统。jBPM在2004年10月18日,发布了2.0版本,并在同一天加入了JBoss,成为了JBoss企业中间件平台的一个组成部分,它的名称也改成JBoss jBPM。随

sz_bdqn的专栏 6082

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

jbpm 入门实例(4)—— JBPM简单实例入门

1、新建项目   主菜单“文件->新建->项目”,在弹出的对话框里,选中JBoss jbpm节点下的“ Process Project ”项。输入项目名:JbpmProject,项目建好后结构如图所示:                 这个项目和通常 Eclipse 的项目结构有点不同,不过  这是一个现在非常流行的项目结构, src/java 存放源文件, test/java

baggio0111的专栏 3062

深入浅出jBPM(jBPM专家力作,涵盖jBPM 3和jBPM 4)

深入浅出jBPM(jBPM专家力作,涵盖jBPM 3和jBPM 4) 市场价 :¥59.00 会员价 : ¥44.25(75折) 样章免费试读:http://www.china-pub.com/195686【作  者】高杰 【丛 书 名】 图灵程序设计丛书  【出 版 社】 人民邮电出版社     【书 号】 9787115209641  【上架时间】 2009-7-8  【出版日期】 2009...

weixin_34262482的博客 140

jbpm4.4实例分享

先分享个视频教程的下载地址:http://www.jeecg.org/forum.php?mod=viewthread&tid=32 本人也是看了这个视频教程后模仿写的一个例子 1、在eclipse上安装jbpm4.4的插件(百度或google或视频教程) 2、定义请假流程 如下图   此流程是一个请假流程,请假人先申请请假,然后有经理审批,经理可以批准或驳回,如果

tianma630的专栏 1万+

jBPM3 vs jBPM4

转自http://www.javaeye.com/topic/333718 jBPM3 vs jBPM4JBoss Goup 目前已经发布了 jBPM4 Alpha1 版本,在版本 4 中最大的变化就是引入 PVM (流程虚拟机)的概念,而引擎内部的调度算法中重要的 Token 机制,在新版中也去掉了,纵观整个代码,变化可以说非常的大,笔者接下来就试着来比较一下这种变化,让

ucqqff的专栏 1220

JBPM3部署在tomcat中

首先,确认手边有一份jbpm3的user guide,有一份还有JBPM3.0源码的压缩包JBPM中是通过org.jbpm.db. JbpmSessionFactory.getInstance()返回一个JbpmSessionFactory实例,下面通过分析getInstance()的过程,说明怎么设置相关配置文件1、JbpmSessionFactory.getInstance()方法首先查找类路

++黑色郁金香的Blog++ 1577

JBPM学习(3):管理流程实例

流程定义就是对一个过程的完整描述,如果说流程定义是一个模板,那么流程实例就是实际执行的业务(个人觉得有一点点像JAVA中的类和实例),根据流程定义从前往后依次执行。 这一节,在上一节管理流程定义的基础上,学习以下几种管理流程实例的方法。 启动流程实例执行等待的流程查看流程实例终止流程实例删除流程实例 这是在第一节定义的流程,本节继续使用该流程进行学习。 管理流程实例的所有测试代码如

ミ安之偌素 2355
上一篇: jbpm基本认识
下一篇: System.getProperty()参数
Y叔输得起
博客等级 码龄16年 15粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值