使用JBPM工作流引擎測試的一個例子
作者:在路上
本文舉出了了一個使用jBPM工作流引擎進行測試的例子。例子中使用一個Persistence用于存儲全局變量值。從使用流程設計器創建流程規則,直到最后參與者參與者執行審批操作,觸發流程流轉到下一個環節,本例中都提供了完整的代碼以供參考。
本文提供使用jBPM工作流引擎測試的一個例子。
提供一個Persistence,用于存儲全局的變量值,方便存儲和獲取
- public class Persistence {
- private static Map variables = null;
- private static String tmpfile = System.getProperty("java.io.tmpdir") + "/temp.object";
- static{
- //加載文件
- try{
- if(new File(tmpfile).exists()){
- FileInputStream in = new FileInputStream(tmpfile);
- ObjectInputStream s = new ObjectInputStream(in);
- variables = (Map)s.readObject();
- }
- if(variables == null){
- variables = new HashMap();
- }
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- //設置一個變量的值
- public static void setVariable(String name,Serializable object){
- if(variables != null){
- variables.put(name, object);
- }
- try {
- FileOutputStream fos = new FileOutputStream(tmpfile);
- ObjectOutputStream oos = new ObjectOutputStream(fos);
- oos.writeObject(variables);
- oos.flush();
- oos.close();
- fos.flush();
- fos.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- //獲取一個變量的值
- public static Serializable getVariable(String name){
- if(variables != null){
- return (Serializable)variables.get(name);
- }
- return null;
- }
- }
1.首先使用流程設計器,創建一個簡單的流程規則
2.創建數據庫表,創建流程定義對象,并部署流程定義
- //創建數據庫表
- public class Jbpm_01_CreateTable extends TestCase {
- public void testCreateTable(){
- JbpmConfiguration.getInstance().createSchema();
- }
- }
- //定義流程定義對象,并部署流程
- public class Jbpm_02_DeployProcessDefinition extends TestCase {
- static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
- public void testDeployProcessDefinition(){
- //讀取流程定義文件,得到流程定義對象
- ProcessDefinition processDefinition = ProcessDefinition.parseXmlResource("test01/processdefinition.xml");
- //可以得到流程定義的名稱
- Persistence.setVariable("processName", processDefinition.getName());
- //JbpmContext對象封裝了hibernate session 對象的功能,可以執行與數據庫持久化相關的操作
- JbpmContext context = jbpmConfiguration.createJbpmContext();
- try{
- context.deployProcessDefinition(processDefinition);
- }catch(Exception e){
- e.printStackTrace();
- context.setRollbackOnly();
- }finally{
- context.close();
- }
- }
- }
3.定義公文Doucment 及其映射文件Doucment.hbm.xml
- 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;
- }
- }
- //Document映射文件Document.hbm.xml
- <hibernate-mapping>
- <class table="tbl_document" name="Document">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="title"/>
- <property name="content"/>
- <property name="processInstanceId"/>
- </class>
- </hibernate-mapping>
4.創建公文并與流程實例綁定
- public class Jbpm_03_CreateDocument extends TestCase {
- static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
- public void testCreateDocument(){
- //JbpmContext對象封裝了hibernate session 對象的功能,可以執行與數據庫持久化相關的操作
- JbpmContext context = jbpmConfiguration.createJbpmContext();
- try{
- Document doc = new Document();
- doc.setTitle("測試公文"+new Random().nextInt(9999));
- context.getSession().save(doc);
- Persistence.setVariable("docId", doc.getId());
- }catch(Exception e){
- e.printStackTrace();
- context.setRollbackOnly();
- }finally{
- context.close();
- }
- }
- }
5.提交公文到流程,觸發流程流轉
- public class Jbpm_05_SubmitDocument extends TestCase {
- static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
- //提交公文到第一個環節
- public void testSubmitDocument(){
- //JbpmContext對象封裝了hibernate session 對象的功能,可以執行與數據庫持久化相關的操作
- JbpmContext context = jbpmConfiguration.createJbpmContext();
- try{
- //已知公文的信息
- int docId = (Integer)Persistence.getVariable("docId");
- Document doc = (Document)context.getSession().load(Document.class, docId);
- long processInstanceId = doc.getProcessInstanceId();
- ProcessInstance processInstance = context.getProcessInstance(processInstanceId);
- //觸發流程實例流轉到下一個環節
- processInstance.signal();
- }catch(Exception e){
- e.printStackTrace();
- context.setRollbackOnly();
- }finally{
- context.close();
- }
- }
- }
6.查看公文所處的當前任務節點
- public class Jbpm_06_CurrentNode extends TestCase {
- static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
- //公文當前所處的環節
- public void testCurrentNode(){
- //JbpmContext對象封裝了hibernate session 對象的功能,可以執行與數據庫持久化相關的操作
- JbpmContext context = jbpmConfiguration.createJbpmContext();
- try{
- //已知公文的信息
- int docId = (Integer)Persistence.getVariable("docId");
- Document doc = (Document)context.getSession().load(Document.class, docId);
- long processInstanceId = doc.getProcessInstanceId();
- ProcessInstance processInstance = context.getProcessInstance(processInstanceId);
- String currentNode = processInstance.getRootToken().getNode().getName();
- System.err.println("公文【"+doc.getTitle()+"】當前所處的環節" +
- "是:"+currentNode+",流程實例是否已結束?"+processInstance.hasEnded());
- }catch(Exception e){
- e.printStackTrace();
- context.setRollbackOnly();
- }finally{
- context.close();
- }
- }
- }
7.獲取流轉個某個參與者處待處理的任務列表
- public class Jbpm_07_SearchMyTaskList extends TestCase {
- static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
- //搜索流轉到某個參與者手上的公文列表
- public void testSearchMyTaskList(){
- //JbpmContext對象封裝了hibernate session 對象的功能,可以執行與數據庫持久化相關的操作
- JbpmContext context = jbpmConfiguration.createJbpmContext();
- try{
- 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 ti = (TaskInstance) iter.next();
- Integer docId = (Integer)ti.getProcessInstance().getContextInstance().getVariable("documnt");
- Document doc = (Document)context.getSession().load(Document.class, docId);
- System.err.println("正在等待【"+actorId+"】審批的公文是:"+doc.getTitle());
- }
- }
- }
8.參與者執行審批操作,觸發流程流轉到下一個環節
- public class Jbpm_08_NextNode extends TestCase {
- static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
- //從一個TaskNode的中間節點出發,觸發流程流轉到下一個環節
- public void testNextNode(){
- //JbpmContext對象封裝了hibernate session 對象的功能,可以執行與數據庫持久化相關的操作
- JbpmContext context = jbpmConfiguration.createJbpmContext();
- try{
- //*******************************************
- //某某用戶要將其手上的某某公文提交到下一個環節
- //*******************************************
- //已知要提交的公文
- Integer docId = (Integer)Persistence.getVariable("docId");
- nextStep(context,"張三",docId);
- nextStep(context,"李四",docId);
- nextStep(context,"王五",docId);
- }catch(Exception e){
- e.printStackTrace();
- context.setRollbackOnly();
- }finally{
- context.close();
- }
- }
- private void nextStep(JbpmContext context,String actorId,Integer docId){
- List taskInstances = context.getTaskMgmtSession().findTaskInstances(actorId);
- for (Iterator iter = taskInstances.iterator(); iter.hasNext();) {
- TaskInstance ti = (TaskInstance) iter.next();
- Integer _docId = (Integer)ti.getProcessInstance().getContextInstance().getVariable("documnt");
- //找到對應的任務實例
- if(docId.equals(_docId)){
- Document doc = (Document)context.getSession().load(Document.class, docId);
- //參與者的任務已經處理完成,需要結束這個任務實例
- //這個動作,在缺省的情況下,會觸發對應的Token的signal()方法,即流向下一個環節
- ti.end();
- System.err.println("公文【"+doc.getTitle()+"】已被【"+actorId+"】審批完成,已提交到下一個環節");
- }
- }
- }
- }
【編輯推薦】
責任編輯:yangsai
來源:
163博客