java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I
ERP,OA,CRM內網系統,需要多個人(多個步驟)處理
JBPM是由JBoss推出的,用來完成工作流的一套開發包。
工作流並不是技術的概念,而是通過程序描述業務流程的功能。
一般使用工作流實現的功能有:請假,報銷,出差申請,保險理賠等
在開發JBPM時,需要先建立一個JBoss的流程描述文件(加入插件),
注意插件在文件夾內部
導入jbpm的sql語句
本欄目
並將流程繪制到該文件中,生成流程圖,以及將流程信息發布到服務器中。
根據業務,在建立好的流程文件中繪制執行流程。
流程由節點和路徑組成
節點分為以下幾類:
1) Start:開始節點
2) End:結束節點
3) Task:任務節點
4) Decision:判斷節點
繪制流程時,必須先有一個流程描述的文檔,根據此文檔來繪制流程。
首先先建立流程圖模型
將xml和圖片文件復制到MyEclipse,如果在MyEclipse裡面下了jbpm插件可以在MyEclipse中建立
在繪制好流程圖後,需要聲明每個Task節點的任務處理人。需要加入jbpm.jar,如果在MyEclipse中可以自動加入hibernate的所有包
本欄目
手動繪圖會生成下面的xml文件,保存會生成圖片
<?xml version="1.0" encoding="UTF-8"?> <process key="reim" name="Reimbursement" xmlns="http://jbpm.org/4.4/jpdl"> <start name="start1" g="173,72,48,48"> <transition to="填寫報銷單" /> </start> <end name="end1" g="423,375,48,48" /> <task name="填寫報銷單" g="148,185,92,52"> <assignment-handler class="com.kane.handler.InsertHandler" /> <transition to="財務審核" g="318,246:" /> </task> <task name="財務審核" g="400,185,92,52"> <assignment-handler class="com.kane.handler.FinancialHandler" /> <transition name="通過" to="exclusive1" g="7,-9" /> <transition name="不通過" to="填寫報銷單" g="315,175:-16,-20" /> </task> <task name="CEO審核" g="144,365,92,52"> <assignment-handler class="com.kane.handler.CEOHandler" /> <transition name="通過" to="end1" g="-10,-23" /> <transition name="不通過" to="填寫報銷單" g="-42,-6" /> </task> <decision name="exclusive1" g="421,281,48,48"> <handler class="com.kane.handler.MoneyCheckHandler" /> <transition name="超過2000" to="CEO審核" g="-42,-24" /> <transition name="不到2000" to="end1" g="8,-10" /> </decision> </process>
在web項目加入hibernate支持
本欄目
建立自己的數據庫
CREATE TABLE member( userid varchar2(20) primary key, roleid int ) #1是普通用,2是財務,3是ceo INSERT INTO member VALUES('kane',1); INSERT INTO member VALUES('kabne1',1); INSERT INTO member VALUES('ka',1); INSERT INTO member VALUES('cw0',2); INSERT INTO member VALUES('cw1',2); INSERT INTO member VALUES('ceo',1); INSERT INTO member VALUES() CREATE TABLE reimbursement( rid varchar2(30) primary key, reason varchar2(200), money number(7,2), userid varchar2(20), pub_time date, check_userid varchar2(20), check_time date, back_reason )
生成映射
dao,service正常寫,記得拷入jbpm.jar到lib裡面
開始寫handler,對應配置文件裡寫好的,注意任務節點實現AssignmentHandler,判斷節點實現DecisionHandler
接著復制兩個配置文件jbpm.cfg.xml和jbpm.hibernate.cfg.xml並修改
<?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> <property name="myeclipse.connection.profile">oracle</property> <property name="connection.url">jdbc:oracle:thin:@192.168.2.55:1521:ORCL</property> <property name="connection.username">ysk</property> <property name="connection.password">123</property> <property name="connection.driver_class"> oracle.jdbc.driver.OracleDriver </property> <property name="dialect"> org.hibernate.dialect.Oracle9Dialect </property> <property name="show_sql">true</property> <property name="format_sql">true</property> <mapping resource="jbpm.repository.hbm.xml" /> <mapping resource="jbpm.execution.hbm.xml" /> <mapping resource="jbpm.history.hbm.xml" /> <mapping resource="jbpm.task.hbm.xml" /> <mapping resource="jbpm.identity.hbm.xml" /> </session-factory> </hibernate-configuration>
本欄目
寫個運行程序發布流程文件
package com.kane.utils; import java.io.File; import org.jbpm.api.Configuration; import org.jbpm.api.NewDeployment; import org.jbpm.api.ProcessEngine; public class ProcessExport { /** * @param args */ public static void main(String[] args) { // 需要先建立一個JBPM核心操作對象 ProcessEngine pe=new Configuration().buildProcessEngine(); //建立一個流程發布對象 NewDeployment nd = pe.getRepositoryService().createDeployment(); //發布一個流程文件 nd.addResourceFromFile(new File("D:/workspace2/JBPMweb/src/Reimbursement.jpdl.xml")); nd.deploy(); pe.close(); } }
出現以下結果即成功,別忘了先前導入自帶的數據庫文件
本欄目
也可以select * from jbpm4_deployprop查看;
接下來開始寫web頁面,默認直接用戶名登陸,登陸之後開始可以查看任務,這裡要用到jbpm
package com.kane.utils; import java.util.ArrayList; import java.util.List; import org.jbpm.api.Configuration; import org.jbpm.api.ProcessEngine; import org.jbpm.api.task.Task; public class JDPMUtil { private static ProcessEngine pe; static{ pe=new Configuration().buildProcessEngine(); } public static List<Task> getAllTaskByUserid(String userid) { List<Task> allTask=new ArrayList<Task>(); //個人任務 List<Task> allPersonTask=pe.getTaskService().findPersonalTasks(userid); //到了財務那,有多個任務,多個人都可以看 List<Task> allGroupTask=pe.getTaskService().findGroupTasks(userid); if (allPersonTask!=null) { allTask.addAll(allPersonTask); } if (allGroupTask!=null) { allTask.addAll(allGroupTask); } return allTask; } }
還要加入mail.jar
出現異常
java.lang.reflect.InvocationTargetException 異常
java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I
解決辦法