java开源项目-使用java开源工作流jbpm开发一个简单的_第1页
java开源项目-使用java开源工作流jbpm开发一个简单的_第2页
java开源项目-使用java开源工作流jbpm开发一个简单的_第3页
java开源项目-使用java开源工作流jbpm开发一个简单的_第4页
java开源项目-使用java开源工作流jbpm开发一个简单的_第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() catch (Exception e) rollback = true; e.printStackTrace(); throw e; finally if (ut != null 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() 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 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().getVariable(t.getId(), “biz_id“); workList.add(item); return workList; /* * 申请人处理审批后的事务 * param request * throws Exception */ public static void leave(HttpServletRequest request) throws Exception UserTransaction ut = DBUtil.getUserTransaction(); Connection conn = DBUtil.getConn(); boolean rollback = false; try ut.begin(); /处理休假情况 boolean isPassed = (Boolean) JBPMUtil.getTaskService().getVari

温馨提示

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

评论

0/150

提交评论