zoukankan      html  css  js  c++  java
  • JBPM工作流

    一、JBPM定义

    JBPM,全称是Java Business Process Management(业务流程管理),它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。

    二、为什么用JBPM

     业务分析师和开发人员使用的是同一种语言来交谈,大大降低了开发的风险,如果要开发一个项目,速度也更快了,因为开发人员不用再将用户需求转化成软件设计了。其次,JBPM采用的不是一般的开发工具,而是自己的图形化开发工具,非常方便随时了解和掌握运行的进程。最后,JBPM的流程框架非常灵活,使用起来也非常安全,它经过了安全认证,因此可以保证一些商业机密不被泄露


    三、JBPM环境配置详解

    首先在Eclipse中配置环境。如下:

    ① 配置GPD(流程设计器)

    Help  ------>  Install New Software

    点击add,出现一个Add Repository

    点击Archive,选择jbbm4.4/install/src/gpd/jbpm-gpd-site.zip

     ② 选择所有插件,然后点Next即可

    ③ 配置JBPM运行时

    1) 打开window --- preferences

    1) 选择 JBoss jBPM --> Runtime Locations

    2) 点击 Add...

    3) 在 Add Location 对话框中,输入一个名字,比如 jbpm-4.4 然后点击 Search...

    4)  Browse For Folder 对话框中,选择你的jbpm 根目录,然后点击 OK

    ④ 在目录中添加JPDL4模式

    如果你想直接编辑XML 源码, 最好是在你的XML 目录中指定一下模式(schema),这样当你在编辑流程源码的时候,可以更好的帮助你编写代码。

    1) 点击窗口 --> 属性(Windows --> Preferences

    2) 选择XML --> 目录(XML --> XML CataLog

    3) 点击添加(Add

    4) 添加XML 目录(Add XML Catalog Entry)的窗口打开

    5) 点击map-icon 的图标下面的按钮并选择文件系统(File System

    6) 在打开的对话框中, 选择jBPM 安装目录下src 文件夹中jpdl.xsd 文件

    7) 点击打开(Open)并且关闭所有的对话框

     


     四、JBPM开发步骤详解

     ① 引入JAR文件

    jbpm4.4的解压包中根目录Jbpmjar包还有lib文件夹中除report-enginewar包外所有jar

    注:因为Jbpm4.4是用Mysql作为DB的,如果要用Oracle作为DB需要引入相应的驱动包。


    ② 创建配置文件


    ③ 画流程图---[新建jpdl.xml文件]

     

    并生成jbpmtest.jpdl.xml文件:


     五、关键代码

    ① 创建表18张

    [http://www.cnblogs.com/a757956132/p/4774188.html]表的详细说明


    ②获取工作流引擎

      ProcessEngine processEngine=new Configuration().setResource("jbpm.cfg.xml").buildProcessEngine();
        
        @Test
        public void test01(){
        	System.out.println(processEngine);
        }
    

    ③部署流程定义

    @Test
        public void deploy(){
        	String deployid = processEngine.getRepositoryService()
        			.createDeployment()
        			.addResourceFromClasspath("jbpmtest.jpdl.xml")
        	        .addResourceFromClasspath("jbpmtest.png").deploy();
        	
        	System.out.println("部署流程 id:"+deployid);
        }
    

    ④启动流程实例

       @Test
        public void startTest(){
        //启动流程实例  通过key,key是process节点中的key,如果不写,默认为name的值
       ProcessInstance pi=processEngine.getExecutionService().startProcessInstanceByKey("jbpmtest");
       System.out.println("start ok!");
       System.out.println("id:"+pi.getId()+",状态:"+pi.getState()+",流程定义的ID:"+pi.getProcessDefinitionId());
        }
    

    ⑤查看任务列表

     @Test
    	public void selectTask(){
        	String user="张三";
        	String users="王五";
        	List<Task> tasks = processEngine.getTaskService().findPersonalTasks(user);
        
        	for (Task task : tasks) {
    			System.out.println("任务ID:"+task.getId()+"	任务名称:"+task.getName()+"	任务办理人:"+task.getAssignee());
    		}
        }
    

      

    ⑥查看当前任务所在点

    @Test
    	public void findSelect(){
        	String name = processEngine.getExecutionService().createProcessInstanceQuery().processInstanceId("jbpmtest.80001").uniqueResult().findActiveActivityNames().toString();
            System.out.println(name);
        }
    

      

    ⑦办理任务

      @Test
        public void testCompleteTask(){
        	processEngine.getTaskService().completeTask("10002");
        	System.out.println("OK");
        }
    

      


    六、流程管理 

     ①查询所有流程定义

    ProcessEngine pro=Configuration.getProcessEngine();  
    	@Test
    	public void findAll(){
    		List<ProcessDefinition> list = pro.getRepositoryService().createProcessDefinitionQuery().list();
    	
    		for (ProcessDefinition pd : list) {
    			System.out.println("id:"+pd.getId()+"	name:"+pd.getName()+"	key:"+pd.getKey()+"	版本号:"+pd.getVersion()+"	部署的id:"+pd.getDeploymentId());
    			
    			
    		}
    	}
    	
    

      

    ②查询最新版的流程定义

    @Test
    	public void getNewFindAll(){
    		//查询所有,让最大的版本排到最后面
    		List<ProcessDefinition> all = pro.getRepositoryService().createProcessDefinitionQuery().orderAsc(ProcessDefinitionQuery.PROPERTY_VERSION).list();
    	
    		//过滤出所有最新的版本
    		Map<String, ProcessDefinition> map=new HashMap<String, ProcessDefinition>();
    	
    		for (ProcessDefinition pd : all) {
    			map.put(pd.getKey(), pd);
    		}
    		//显示
    		for (ProcessDefinition pd : map.values()) {
    			  System.out.println("id=" + pd.getId()// 格式为:{key}-{version},用于唯一的标识一个流程定义  
    			    + ", name=" + pd.getName()// 流程定义的名称,jpdl.xml中根元素的name属性的值  
    			    + ", key=" + pd.getKey()// 流程定义的key,jpdl.xml中根元素的key属性的值,默认是name属性的值  
    			    + ", version=" + pd.getVersion()// 自动生成的,同一个名称的第一个为1,以后的自动加1.  
    			    + ", deploymentId=" + pd.getDeploymentId()); // 所属的部署对象  
    			   
    		}
    	}
    

      

    ③根据id删除

    注:deleteDeploymentCascade级联删除

    @Test
    	public void delById(){
    		pro.getRepositoryService().deleteDeploymentCascade("1");
    		System.out.println("del ok!!!");
    	}
    

    ④删除指定key的所有版本的流程  

    @Test
    	public void delByKey(){
    		List<ProcessDefinition> list = pro.getRepositoryService().createProcessDefinitionQuery().processDefinitionKey("jbpmtest").list();
    	
    		for (ProcessDefinition pd : list) {
    			pro.getRepositoryService().deleteDeploymentCascade(pd.getDeploymentId());
    		}
    	}
    

     ⑤ZIP 部署 

     

    @Test
    	public void addZip(){
    		//部署zip格式的资源
    		InputStream is=this.getClass().getClassLoader().getResourceAsStream("src.zip");
    		ZipInputStream zs=new ZipInputStream(is);
    		String id= pro.getRepositoryService().createDeployment().addResourcesFromZipInputStream(zs).deploy();
    		  System.out.println("部署成功:deploymentid:"+id);
    
    	}
    

      

  • 相关阅读:
    js内置数据类型
    vue禁止复制的方式
    阻止element组件中的<el-input/>的粘贴功能
    Vue插件集合
    qs.parse()、qs.stringify()、JSON.stringify() 用法及区别
    es6数组的一些函数方法使用
    文章段落首字母缩进两个字符
    深圳scala-meetup-20180902(3)- Using heterogeneous Monads in for-comprehension with Monad Transformer
    深圳scala-meetup-20180902(2)- Future vs Task and ReaderMonad依赖注入
    深圳scala-meetup-20180902(1)- Monadic 编程风格
  • 原文地址:https://www.cnblogs.com/WJ-163/p/6158698.html
Copyright © 2011-2022 走看看