关闭

Jbpm工作流介绍

标签: Jbpm工作流Jbpm4.4
1541人阅读 评论(1) 收藏 举报
分类:

工作流介绍:

  • 工作流(workFlow),就是"业务过程的部分或整体在计算机应用环境化的自动化"。它主要解决的是"使多个参与者之间按照某种预定义的规则转递文档,信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现"。
    • 通俗的说就是"流程就是将多个人在一起合作完成的事情的步骤,把步骤变成计算机能理解的形式就是工作流。"
  • 工作流管理系统(WFMS,workflow Management System)的主要功能是通过计算机技术的支持去定义,执行和管理工作流,协调工作流执行过程中工作间以及群体成员之间的信息交互。应能提供以下三个方面的功能支持:
    • 定义工作流:包括具体的活动,规则等。
    • 运行控制功能:在运行环境中管理工作流程,对工作流程过程中的活动进行调度。
    • 运行交互功能:指在工作流运行中,WFMS与用户(活动的参与者)及外部应用程序工具交互的功能。
  • 采用工作流关系的优点:
    • 提高系统的柔性,适应业务流程的变化。
    • 实现更好的业务过程控制,提高顾客服务质量。
    • 降低系统开发和维护成本。
  • 工作流框架有:JBPM(Java Business Process Management),OSWorkflow,ActiveBPEL,YAWL等。

Jbmp快速入门:

  • 首先是环境的搭建:在Jbmp下载下载。下载jbmp4.4的。下载下来进行解压得到一个Jbmp4.4文件。先是在eclipse或myeclipse中安装流程设计器,myeclipse是绿色版的好像安装不了。安装方法见另外一篇博客。另外还要添加xsd文件,xml文件约束具体也见另外一篇博客
  • 现在,开始导入Java包。显示核心包jbpm.jar。还有就是lib下面的大部分包,不是所有的,还有这个文件下有些不是Java包。如下介绍:
    • JBPM_HOME/lib/*.jar,不添加以下jar包:servlet-api.jar, junit.jar。其中junit.jar一定不要添加,因为是3.8.2版本,与我们使用的junit4有冲突。
    • 由于slf4j-jdk14.jar、slf4j-log4j12.jar都具有处理日志的功能,会避免出现冲突,所以可去掉slf4j-jdk14.jar。
    • 所使用的数据库对应的驱动的jar包(第2步所添加的jar包中已包含mysql的jdbc驱动jar包)。
  • 添加配置文件:
    • 配置文件可以从JBPM_HOME/examples/src/中拷贝: jbpm.cfg.xml、 logging.propertiehibernate包下/project/etc/log4j.properties即可)、 jbpm.hibernate.cfg.xml,配置文件放到项目的src下。
    • 修改logging.properties中的日志输出级别s(拷贝为Error: log4j.rootLogger=ERROR, stdout
    • 修改jbpm.hibernate.cfg.xml中的数据库连接信息。如果使用MySql,使用的方言一定要是org.hibernate.dialect.MySQL5InnoDBDialect。
    • 数据库连接编码一定要是UTF-8。否则可能会在部署含有中文字符的流程定义时会抛异常,说sql语法错误。
    • 连接数据库的时候,建议使用
          jdbc:mysql://localhost:3306/itcastjbpm?useUnicode=true&characterEncoding=utf8可防止存储到数据库的值是乱码
    • 注意:如使用MySQLDialect,就会在流程实例结束时抛异常:com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException:Cannot delete or update a parent row: a foreign key constraint fails(`jbpm44_20101028/jbpm4_execution`, CONSTRAINT `FK_EXEC_INSTANCE` FOREIGN KEY(`INSTANCE_`) REFERENCES `jbpm4_execution` (`DBID_`))。。


  • 初始化数据库:
    • 执行sql脚本文件${JBPM4.4_HOME}/install/src/db/create/jbpm.*.create.sql。
    • 使用Hibernate的自动建表,在jbpm.hibernate.cfg.xml中配置:hibernate.hbm2ddl.auto=update。
      可以初始化程序创建表,例如:
      public void testCreateSchema() { // hbm2ddl.auto=update
      new org.hibernate.cfg.Configuration().configure("jbpm.hibernate.cfg.xml").buildSessionFactory();
      }
    • 因为Jbmp是底层是基于Hibernate的。
  • 到此环境搭建完成。数据库会生成18张表。
  • 先通过上面安装的gdp软件画一张简单的流程图,安装成功的话,在新建文件中有一个JBoss Jbpm,只需输入名称就行。如下:
  • 保存,通过source可以查看生成的xml文件。这里点击具体的任务在properties视图,选择general,name。输入“申请”。assignment中的type选择assignee。expression输入“张三”。第二个也是一样。选择general,name。输入“经理批阅”,assignment中的type选择assignee。expression输入“李四”。
  • 在创建一个Java类就可以了,具体内容如下:
    package cn.itcast.hello;
    
    import java.util.List;
    
    import org.jbpm.api.Configuration;
    import org.jbpm.api.ProcessEngine;
    import org.jbpm.api.ProcessInstance;
    import org.jbpm.api.task.Task;
    import org.junit.Test;
    
    public class TestClass {
    	//得到流程引擎
    	ProcessEngine engine = org.jbpm.api.Configuration.getProcessEngine();
    	/***
    	 * 一。部署流程定义
    	 */
    	@Test
    	public void deploymentPorcessDefintion(){
    		String deploymentId = engine.getRepositoryService()//与部署相关对象和流程定义相关Service
    		.createDeployment()//创建部署对象
    		.addResourceFromClasspath("cn\\itcast\\hello\\helloworld.jpdl.xml")//从类路径下加载资源文件
    		.addResourceFromClasspath("cn\\itcast\\hello\\helloworld.png")
    		.deploy();//完成部署
    		System.out.println("部署对象ID:"+deploymentId);
    		
    	}
    	/***
    	 * 二。启动流程实例
    	 */
    	@Test
    	public void startProcessInstance(){
    		String key="helloworld";
    		ProcessInstance pi = engine.getExecutionService()//管理流程实例和执行对象
    					.startProcessInstanceByKey(key);//按照流程的key启动流程实例,默认会按照最新版本的key启动流程实例
    		System.out.println("流程实例Id"+pi.getId());
    		System.out.println("流程定义的ID:"+pi.getProcessDefinitionId());
    	}
    	/**
    	 * 查询我的个人任务列表
    	 */
    	@Test
    	public void findMyPersonTaskList(){
    		String userId="张三";
    		List<Task> listTask= engine.getTaskService()//与任务相关的service
    				.findPersonalTasks(userId);
    		if(listTask!=null&&listTask.size()>0){
    			for(Task task:listTask){
    				System.out.println("任务id:"+task.getId());
    				System.out.println("任务名称:"+task.getName());
    				System.out.println("任务的办理人:"+task.getAssignee());
    			}
    		}
    	}
    	/***
    	 * 完成我的个人任务
    	 */
    	@Test
    	public void complateMytask(){
    		String taskId = "20001";
    		engine.getTaskService().//与任务相关的service
    			completeTask(taskId);//使用任务Id,完成任务。
    		System.out.println("完成任务,任务id是:"+taskId);
    	}
    }
    

  • 这个时候查看数据库表,就会有数据。但是通过上面的流程查看,这个任务并没有完成。因为需要经过两个人批阅。所以可以查看jbpm4_task表来查看任务Id。接下来是李四完成任务,在执行完成我的个人任务方法就行。
  • 到此一个简单的入门就OK了。




0
1

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    欢迎关注个人微信号
      欢迎关注微信账号:在路上的coder .每天一篇java相关或互联网相关的文章




    个人资料
    • 访问:783010次
    • 积分:2612
    • 等级:
    • 排名:第14106名
    • 原创:85篇
    • 转载:4篇
    • 译文:0篇
    • 评论:18条
    资源分享地址
    个人博客地址
    博客专栏
    最新评论