java开源项目-使用Java开源工作流jBPM开发一个简单的.doc_第1页
java开源项目-使用Java开源工作流jBPM开发一个简单的.doc_第2页
java开源项目-使用Java开源工作流jBPM开发一个简单的.doc_第3页
java开源项目-使用Java开源工作流jBPM开发一个简单的.doc_第4页
java开源项目-使用Java开源工作流jBPM开发一个简单的.doc_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

java开源项目-使用Java开源工作流jBPM开发一个简单的时间:2011-05-25 23:36来源:博客 作者:jack 点击: 次 jBPM是jboss旗下遵守LGPL许可的java开源工作流,功能比较完善,从4.0开始引入了pvm的概念,支持jPDL、BPEL等流程定义语言。由于相关资料还比较少,开发自己的一个demo还不是太容易,本文详细讲解如何做一个简单的demo程序。 我们从/jbossjbpm/jbpm_downloads/下载jBPM,实际使用时发现4.0.CR1和4.1版本各有一些问题,此处把这两个版本都下载下来。开发使用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下的jbpm-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%/install/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 varchar(500), - 请假理由 approve_user varchar(50), - 审批人 approve_time timestamp, - 审批时间 is_passed smallint, - 是否同意,1 同意,2 驳回 approve_remark varchar(500), - 审批备注,如驳回的原因 back_time timestamp - 销假时间 ); 4、配置JOTM事务支持。 把perties、jta.jar、commons-logging.jar、carol.jar、connector-1_5.jar、jotm.jar、jotm_jrmp_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 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.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 InitialContext().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 Exception 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.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; 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(); pe = config.buildProcessEngine(); return pe; public static RepositoryService getRepositoryService() if (repositoryService = null) repositoryService = getProcessEngine().getRepositoryService(); return repositoryService; public static ExecutionService getExecutionService() if (executionService = null) executionService = getProcessEngine().getExecutionService(); return executionService; public static IdentityService getIdentityService() if (identityService = null) identityService = getProcessEngine().getIdentityService(); return identityService; public static TaskService getTaskService() if (taskService = 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.util.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 AskForLeave 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, 李, 五); JBPMUtil.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.getParameter(begin_leave_time) + , + + request.getParameter(end_leave_time) + , + + request.getParameter(leave_reason) + ); System.out.println(insert: + sql); stmt.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS); ResultSet rs = stmt.getGeneratedKeys(); int id = 0; if (rs.next() id = rs.getInt(1); System.out.println(-id: + id); /*工作流部分 /新建工作流实例 Map var = new HashMap(); var.put(owner, employeeName); var.put(biz_id, id); ProcessInstance processInstance = JBPMUtil.getExecutionService().startProcessInstanc eByKey(askForLeave, var); /执行动作 List tasks = JBPMUtil.getTaskService().findPersonalTasks(employ eeName); for (Task t : tasks) if (processInstance.getId().equals(JBPMUtil.getExecut ionService().findExecutionById(t.getExecutionId(). getProcessInstance().getId() & t.getActivityName().equals(填写请假申请) JBPMUtil.getTaskService().completeTask(t.getId(); catch (Exception e) rollback = true; e.printStackTrace(); throw e; finally if (ut != null & ut.getStatus() != Status.STATUS_NO_TRANSACTION) if (rollback) ut.rollback(); else mit(); if (conn != null) conn.close(); /* * 获取经理的工作列表 * return * throws Exception */ public static List getManagerWorkList() throws Exception List workList = new ArrayList(); List tasks = JBPMUtil.getTaskService().findGroupTasks(managerNa me); System.out.println(-task count: + tasks.size(); for (Task t : tasks) String processDefinitionId = JBPMUtil.getExecutionService().findExecutionById(t .getExecutionId().getProcessInstance().getProcessD efinitionId(); ProcessDefinition processDefinition = JBPMUtil.getRepositoryService().createProcessDefin itionQuery().processDefinitionId(processDefinitionI d).uniqueResult(); System.out.println(-pro name: + JBPMUtil.getExecutionService().findExecutionById(t .getExecutionId().getProcessInstance().getProcessD efinitionId(); System.out.println(-acct name: + t.getActivityName(); if (请假流程.equals(processDefinition.getName() & t.getActivityName().equals(审批) Map item = new HashMap(); item.put(wfId, JBPMUtil.getExecutionService().findExecutionById(t .getExecutionId().getProcessInstance().getId(); item.put(wfName, 请假流程); item.put(taskId, t.getId(); item.put(taskName, t.getActivityName(); workList.add(item); return workList; /* * 获取位置 * param wfId * return */ public static List getActiveActivityCoordinates(String wfId) List result = new ArrayList(); ProcessInstance processInstance = JBPMUtil.getExecutionService().findProcessInstance ById(wfId); String processDefinitionId = processInstance.getProcessDefinitionId(); Set activities = processInstance.findActiveActivityNames(); for (String act : activities) ActivityCoordinates coor = JBPMUtil.getRepositoryService().getActivityCoordin ates(processDefinitionId, act); result.add(coor); return result; /* * 根据请假单id获取请假单信息 * param id * return * throws Exception */ public static Map getById(String id) throws Exception Map form = new HashMap(); Connection conn = DBUtil.getConn(); try Statement stmt = conn.createStatement(); ResultSet rst = stmt.executeQuery(select * from ask_for_leave where id= + id); if (rst.next() form.put(apply_user, rst.getString(apply_user); form.put(begin_leave_time, rst.getString(begin_leave_time); form.put(end_leave_time, rst.getString(end_leave_time); form.put(leave_reason, rst.getString(leave_reason); rst.close(); stmt.close(); catch (Exception e) e.printStackTrace(); throw e; finally if (conn != null) conn.close(); return form; /* * 根据工作流id货物请假单id * param wfId * return * throws Exception */ public static String getBizId(String taskId) throws Exception return JBPMUtil.getTaskService().getVariable(taskId, biz_id).toString(); /* * 审批 * param request * throws Exception */ public static void approval(HttpServletRequest request) throws Exception UserTransaction ut = DBUtil.getUserTransaction(); Connection conn = DBUtil.getConn(); boolean rollback = false; try ut.begin(); /*业务部分 /审批信息存入数据库 Statement stmt = conn.createStatement(); String sql = update ask_for_leave set + approve_user= + managerName + , + approve_time=now(), + is_passed= + request.getParameter(is_passed) + , + approve_remark= + request.getParameter(approve_remark) + + where id= + request.getParameter(biz_id); System.out.println(-update: + sql); stmt.executeUpdate(sql); System.out.println(-update complete); /*工作流部分 boolean isPassed = false; if (1.equals(request.getParameter(is_passed) isPassed = true; Map var = new HashMap(); var.put(is_passed, isPassed); JBPMUtil.getTaskService().completeTask(request.get Parameter(taskId), var); catch (Exception e) rollback = true; e.printStackTrace(); throw e; finally if (ut != null & ut.getStatus() != Status.STATUS_NO_TRANSACTION) if (rollback) ut.rollback(); else mit(); if (conn != null) conn.close(); /* * 获取员工的工作列表 * return * throws Exception */ public static List getEmployeeWorkList() throws Exception List workList = new ArrayList(); List tasks = JBPMUtil.getTaskService().findPersonalTasks(employ eeName); System.out.println(-task count: + tasks.size(); for (Task t : tasks) String processDefinitionId = JBPMUtil.getExecutionService().findExecutionById(t .getExecutionId().getProcessInstance().getProcessD efinitionId(); ProcessDefinition processDefinition = JBPMUtil.getRepositoryService().createProcessDefin itionQuery().processDefinitionId(processDefinitionI d).uniqueResult(); System.out.println(-pro name: + JBPMUtil.getExecutionService().findExecutionById(t .getExecutionId().getProcessInstance().getProcessD efinitionId(); System.out.println(-acct name: + t.getActivityName(); if (请假流程.equals(processDefinition.getName() Map item = new HashMap(); item.put(wfId, JBPMUtil.getExecutionService().findExecutionById(t .getExecutionId().getProcessInstance().getId(); item.put(wfName, 请假流程); item.put(taskId, t.getId(); item.put(taskName, t.getActivityName(); item.put(biz_id, JBPMUtil.getTaskService().

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论