1、java开源项目使用Java开源工作流jBPM开发一个简单的java开源项目-使用Java开源工作流jBPM开发一个简单的时间:2011-05-25 23:36来源:博客 作者:jack 点击: 次 jBPM是jboss旗下遵守LGPL许可的java开源工作流,功能比较完善,从4.0开始引入了pvm的概念,支持jPDL、BPEL等流程定义语言。由于相关资料还比较少,开发自己的一个demo还不是太容易,本文详细讲解如何做一个简单的demo程序。 我们从http:/www.jboss.org/jbossjbpm/jbpm_downloads/下载jBPM,实际使用时发现4.0.CR1和4.1版本各
2、有一些问题,此处把这两个版本都下载下来。开发使用4.1版本,Eclipse插件GPD(图形化设计流程)使用4.0.CR1版本的,tomcat使用6.0.18版本的,jdk要求5.0及以上,Eclipse使用eclipse-jee-galileo-win32版本的。 下载包里面有自带的一个example,根据jBMP的文档可以部署,但这个example把工作流部分封装为RESTful Web Service,学习起来有一定难度,看了会让人一头雾水,此处就不讲了。以下讲述如何把jBPM嵌入到应用系统中去。 1、在Eclipse中安装GPD。 把%jbpm-4.0.CR1_HOME%/gpd下的jb
3、pm-gpd-site.zip安装到Eclipse中,熟悉Eclipse的知道安装方法,在jBPM的文档中也有介绍。 2、在Eclipse中建立一个动态网站的项目jBPMDemo,复制必要的jar文件到WEB-INF/lib下面。 把%jbpm-4.1_HOME%/lib下的所有jar文件、%jbpm-4.1_HOME%/jbpm.jar复制过去。 但juel.jar中javax/el中的类与tomcat中的有冲突,把juel.jar中的javax/el删除。 3、配置mysql数据库。 在mysql数据库中建立一个名为jbpmdb的数据库,在里面执行%jbpm-4.1_HOME%/insta
4、ll/src/db/jbpm.mysql.create.s ql建立jbpm所需的数据库表。 另外建立一个表存放业务数据: create table ask_for_leave ( id MEDIUMINT NOT NULL AUTO_INCREMENT primary key, apply_user varchar(50), - 申请人 apply_time timestamp default now(), - 申请时间 begin_leave_time timestamp, - 假期开始时间 end_leave_time timestamp, - 假期结束时间 leave_reason v
5、archar(500), - 请假理由 approve_user varchar(50), - 审批人 approve_time timestamp, - 审批时间 is_passed smallint, - 是否同意,1 同意,2 驳回 approve_remark varchar(500), - 审批备注,如驳回的原因 back_time timestamp - 销假时间 ); 4、配置JOTM事务支持。 把carol.properties、jta.jar、commons-logging.jar、carol.jar、connector-1_5.jar、jotm.jar、jotm_jrmp_
6、stubs.jar、jts1_0.jar、mysql-connector-java-3.1.11-bin.jar、objectweb-datasource.jar、xapool.jar放到%tomcat_home%/lib下面。 把howl.jar、jotm.jar、objectweb-datasource.jar、ow_carol.jar、xapool.jar放到WEB-INF/lib下面。 在jBPLDemo的context配置数据源,代码如下: org.hibernate.dialect.MySQ LInnoDBDialect java:comp/en v/JbpmDS org.hibe
7、 rnate.transaction.JTATransactionFactory o rg.hibernate.transaction.JOTMTransactionManagerLook up java:comp/env/UserTransa ction 5、在Eclipse中GPD定义流程。 GPD对中文的支持还有问题,要用图形界面与直接编写代码相结合的方式,最后效果如下图: 产生的图片askForLeave.png放到应用的askForLeave文件夹下面。 6、建立几个java类。 demo.jbpm.DBUtil: package demo.jbpm; import java.sql
8、.Connection; import javax.naming.InitialContext; import javax.sql.DataSource; import javax.transaction.UserTransaction; public class DBUtil private static DataSource ds; /* * 获取数据源 * return * throws Exception */ public static DataSource getDS() throws Exception if (ds = null) ds = (DataSource) new I
9、nitialContext().lookup(java:comp/env/JbpmDS); return ds; /* * 获取数据库连接 * return * throws Exception */ public static Connection getConn() throws Exception return getDS().getConnection(); /* * 获取事务UserTransaction * return * throws Exception */ public static UserTransaction getUserTransaction() throws E
10、xception UserTransaction ut = (UserTransaction) new InitialContext().lookup(java:comp/env/UserTransac tion); return ut; package demo.jbpm; import org.jbpm.api.Configuration; import org.jbpm.api.ExecutionService; import org.jbpm.api.IdentityService; import org.jbpm.api.ProcessEngine; import org.jbpm.
11、api.RepositoryService; import org.jbpm.api.TaskService; public class JBPMUtil private static ProcessEngine pe; private static RepositoryService repositoryService; private static ExecutionService executionService; private static IdentityService identityService; private static TaskService taskService;
12、 public static void deploy(String jdplPath) String deployId = getRepositoryService().createDeployment().addResou rceFromClasspath(jdplPath).deploy(); System.out.println(-deploy id: + deployId); public static ProcessEngine getProcessEngine() if (pe = null) Configuration config = new Configuration();
13、pe = config.buildProcessEngine(); return pe; public static RepositoryService getRepositoryService() if (repositoryService = null) repositoryService = getProcessEngine().getRepositoryService(); return repositoryService; public static ExecutionService getExecutionService() if (executionService = null)
14、 executionService = getProcessEngine().getExecutionService(); return executionService; public static IdentityService getIdentityService() if (identityService = null) identityService = getProcessEngine().getIdentityService(); return identityService; public static TaskService getTaskService() if (task
15、Service = null) taskService = getProcessEngine().getTaskService(); return taskService; package demo.jbpm; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.u
16、til.Set; import javax.servlet.http.HttpServletRequest; import javax.transaction.Status; import javax.transaction.UserTransaction; import org.jbpm.api.ProcessDefinition; import org.jbpm.api.ProcessInstance; import org.jbpm.api.model.ActivityCoordinates; import org.jbpm.api.task.Task; public class Ask
17、ForLeave private final static String employeeName = 王三; private final static String managerName = 李五; public static void deploy() JBPMUtil.deploy(jpdl/askForLeave.jpdl.xml); JBPMUtil.getIdentityService().createUser(employeeN ame, 王, 三); JBPMUtil.getIdentityService().createUser(managerNa me, 李, 五); J
18、BPMUtil.getIdentityService().createGroup(manager ); JBPMUtil.getIdentityService().createMembership(man agerName, manager); /* * 请假申请 * param request * throws Exception */ public static void apply(HttpServletRequest request) throws Exception UserTransaction ut =DBUtil.getUserTransaction(); Connection conn = DBUtil.getConn(); boolean rollback = false; try ut.begin(); /*业务部分 /请假申请存入数据库 Statement stmt = conn.createStatement(); String sql = insert into ask_for_leave(apply_user, + begin_leave_time,end_leave_time,leave_reason) values( + + request.getParameter(apply_user) + , + + request