zoukankan      html  css  js  c++  java
  • jbpm

    删除流程实例:

    Jbpm流程引擎

    定义:

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

    作用:

    jbpm的流程框架非常灵活,使用起来也非常安全,降低开发的风险,同时jbpm拥有自己的图形化开发工具,非常方便随时了解和掌握运行的进程

    Jbpm的开发步骤:

    1、 引入jbpm 4.4 jar

    2、 引入jbpm.cfg.xml、jbpm.hibernate.cfg.xml核心配置文件如图:

    Jbpm.cfg.xml 配置:

    <?xml version="1.0" encoding="UTF-8"?>
    
    <jbpm-configuration>
    
      <import resource="jbpm.default.cfg.xml" />
      <import resource="jbpm.businesscalendar.cfg.xml" />
      <import resource="jbpm.tx.hibernate.cfg.xml" />
      <import resource="jbpm.jpdl.cfg.xml" />
      <import resource="jbpm.bpmn.cfg.xml" />
      <import resource="jbpm.identity.cfg.xml" />
    
      <!-- Job executor is excluded for running the example test cases. -->
      <!-- To enable timers and messages in production use, this should be included. -->
      <!--
      <import resource="jbpm.jobexecutor.cfg.xml" />
      -->
    
    </jbpm-configuration>

    Jbpm.hibernate.cfg.xml 配置:

    <?xml version="1.0" encoding="utf-8"?>
    
    <!DOCTYPE hibernate-configuration PUBLIC
              "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
              "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    
    <hibernate-configuration>
      <session-factory>
      
         <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
         <property name="hibernate.connection.url">jdbc:mysql:///jbpm</property>
         <property name="hibernate.connection.username">root</property>
         <property name="hibernate.connection.password">123456</property>
         <property name="hibernate.hbm2ddl.auto">update</property>
         <property name="hibernate.format_sql">true</property>
         <property name="hibernate.show_sql">true</property>
         
         <mapping resource="jbpm.repository.hbm.xml" />
         <mapping resource="jbpm.execution.hbm.xml" />
         <mapping resource="jbpm.history.hbm.xml" />
         <mapping resource="jbpm.task.hbm.xml" />
         <mapping resource="jbpm.identity.hbm.xml" />
         
      </session-factory>
    </hibernate-configuration>

    Log4j.properties 配置:

    ### direct log messages to stdout ###
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target=System.err
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
    
    ### direct messages to file mylog.log ###
    log4j.appender.file=org.apache.log4j.FileAppender
    log4j.appender.file.File=c:/mylog.log
    log4j.appender.file.layout=org.apache.log4j.PatternLayout
    log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
    
    ### set log levels - for more verbose logging change 'info' to 'debug' ###
    
    log4j.rootLogger=info, stdout

    3、 创建表结构 (有18张表)

    4/**
    5、     * 使用jbpm 方式创建表结构  18张表
    6、     */
    7public void createTable()
    8、    {
    9、           org.jbpm.api.Configuration.getProcessEngine();
             }

    流程引擎的使用步骤:

    1 、部署流程实例:

    1public void deploy()
    2、        {
    3//通过Configuration 类构建流程引擎对象
    4、            ProcessEngine processEngine = Configuration.getProcessEngine();
    56//获取RepositoryService 接口服务
    7、            RepositoryService repositoryService = processEngine.getRepositoryService();
    89//发布的方式:零散发布
    10、            repositoryService.createDeployment()
    11、                .addResourceFromClasspath("jbpm_test.jpdl.xml")
    12、                .addResourceFromClasspath("jbpm_test.png")
    13、                .deploy();14、        }

    其他发布方式:

    2、 启动流程实例: 

    public void startProcessInstanceByKey()
        {
            //通过Configuration 类构建流程引擎对象
            ProcessEngine processEngine = Configuration.getProcessEngine();
            
            //获取ExecutionService 对象
            ExecutionService executionService = processEngine.getExecutionService();
            
            executionService.startProcessInstanceByKey("jbpm_test");  //key 默认为流程文件名称
        }

    3、查询个人任务 

    ProcessEngine processEngine = Configuration.getProcessEngine();
            
            TaskService taskService = processEngine.getTaskService();
            
            List<Task> list =  taskService.findPersonalTasks("员工");
            for(Task t:list)
            {
                System.out.println("任务编号:"+t.getId());
                System.out.println("任务名称:"+t.getName());
            } 

    4、 办理个人任务

    public void personalComplete()
        {
            ProcessEngine processEngine = Configuration.getProcessEngine();
            
            TaskService taskService = processEngine.getTaskService();
            
            taskService.completeTask("50002");  //任务id
        }

    流程变量设置:

    public void taskComplete()
        {
            TaskService taskService = Configuration.getProcessEngine().getTaskService();
            Map<String, User> userMap = new HashMap<String, User>();
            User user = new User();
            user.setDay(2);
            user.setName("小明");
            userMap.put("user", user);
            //办理业务并设置流程变量
            taskService.setVariables("240002", userMap);
            taskService.completeTask("240002");
        }

    流程引擎ProcessEngine 的六大服务接口:

    流程引擎processEngine 对象的获取:通过Configuration 类的构建如:

    ProcessEngine processEngine = Configuration.getProcessEngine();

    1、  RepositoryService 接口(流程资源服务):

    RepositoryService  service= processEngine.getRepositoryService()

    作用:提供对流程的部署、删除、查询和流程图的查看操作。

    常用方法 如下图:

    部署流程实例:同【1】

    查看流程实例:

    public void processDefinitionInstanse()
        {
            ProcessEngine processEngine = Configuration.getProcessEngine();
            
            RepositoryService repositoryService = processEngine.getRepositoryService();
            //获取查看流程实例的query对象
            ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
            List<ProcessDefinition> list = processDefinitionQuery.list();
            for(ProcessDefinition p:list)
            {
                System.out.println("流程对应的id:"+p.getId());
                System.out.println("流程对应的名称:"+p.getName());
                System.out.println("流程对应的key"+p.getKey());
                System.out.println("版本:"+p.getVersion());
                System.out.println(p.getDeploymentId());
            }
        }

    ProcessDefinitionQuery常用方法:

    ProcessDefinition常用方法:

    删除流程实例:

    public void deleteProcessDefinfition()
        {
            ProcessEngine processEngine = Configuration.getProcessEngine();
            RepositoryService repositoryService = processEngine.getRepositoryService();
            
            /**
             * 删除方式一   
             * deleteDeployment(java.lang.String deploymentId) 
             * 只能删除没有运行的流程实例。
             */
            repositoryService.deleteDeployment("40001");
            
            /**
             * 删除方式二
             * deleteDeploymentCascade(java.lang.String deploymentId) 
             * 删除部署、包含的流程定义、相关流程实例及其历史信息
             */
            //repositoryService.deleteDeploymentCascade("40001"); //强制删除
        }

    2、 ExecutionService 接口(流程执行服务接口):

    ExecutionService execution = processEngine.getExecutionService()

    作用:提供启动流程服务实例、推动、删除、等操作。

    启动流程实例:如:【2】

    推动流程:

    public void signalExecutionById()
        {
            /**
             * 让流程向后执行一步
             * signalExecutionById(java.lang.String executionId, java.lang.String signalName)  
             * signaName: 下一个节点 transition 的 name
             */
            
            ExecutionService executionService = Configuration.getProcessEngine().getExecutionService();
            executionService.signalExecutionById("60001", "to 部门负责人");
        }

    3、 TaskService 接口(人工任务服务):

    TaskService taskService = processEngine.getTaskService()

    作用:提供对任务的创建、提交、查询、删除等操作。

    常用方法 如下图:

    查询任务(TaskQuery):

    public void personalTaskList()
        {
            ProcessEngine processEngine = Configuration.getProcessEngine();
            TaskService taskService = processEngine.getTaskService();
            
            //获取任务查询对象
            TaskQuery taskQuery =  taskService.createTaskQuery();
            //根据操作人查询任务列表
            List<Task> list = taskQuery.assignee("员工").list();
            
            //查询所有的任务列表
            //List<Task> list = taskQuery.list();
            for(Task t:list)
            {
                System.out.println("任务编号:"+t.getId());
                System.out.println("任务名称:"+t.getName());
            }
        }

    TaskQuery常用方法:

    办理任务:

    public void completeTask()
        {
            ProcessEngine processEngine = Configuration.getProcessEngine();
            TaskService taskService = processEngine.getTaskService();
            taskService.completeTask("80002");
        }

    4、 HistoryService接口(流程历史服务):

    HistoryService history = processEngine.getHistoryService();

    作用:提供对历史任务的关联操作、对历史库中历史流程实例、历史活动实例等、等记录的查询操作。

    5、 ManagementService 接口:

    ManagementService mservice= processEngine.getManagementService()

    6、IdentityService 接口:

           IdentityService identitySerivce = processEngine.getIdentityService()

    作用:身份认证服务接口。提供对流程用户、用户组管理。

    流程图的组成:

    1、 活动 Activity /节点 node

    2、 流转Transition /连线(单向箭头)

    3、 事件

    流转(transition)

    1、 一般情况下一个活动可以指定一个或多个transition

    开始活动(start)中只能有一个transition

    结束活动(end)中没有transition

    其他活动可以有一个或多个

    2、 如果自有一个transition ,则可以不指定名称,如果有多个,则要分别指定唯一的名称

    活动(activity)

    1、 开始活动

    代表流程的开始边界,一个流程有且自能有一个start活动,开始活动自能自定一个transition。在流程实例启动后,会自动的使用这个唯一的transition,到下一个活动

    2、 End/end-error/end-cancel(结束活动)

    带表流程的结束边界,可以有多个,也可以没有,如果有多个,则到达任一个活动,整个流程结束,如果没有,则到达最后一个transition活动,流程就结束

    3、 State状态活动

    作用:等待。可以使用signal 使其结束等待,并向后执行一步

    判断活动(decision)

    为其指定一个实现类:DecisionHandler

        private static final long serialVersionUID = 1L;
    
        @Override
        public String decide(OpenExecution execution) {
            
            System.out.println("decide");
            User user = (User) execution.getVariable("user");
            int day = user.getDay();
            System.out.println("请假天数:"+day);
            if(day > 3)
            {
                return "to 总经理审批";
            }
            
            return "to end1";
        }

    测试:

    public void test()
        {
            //发布流程实例
            ProcessEngine processEngine = Configuration.getProcessEngine();
            processEngine.getRepositoryService()
                .createDeployment()
                .addResourceFromClasspath("com/jbpm_decision/jbpm_decision.jpdl.xml")
                .addResourceFromClasspath("com/jbpm_decision/jbpm_decision.png")
                .deploy();
            Map<String, User> map = new HashMap<String, User>();
            User user = new User();
            user.setDay(2);
            user.setName("张三");
            map.put("user", user);
            
            //启动流程实例
            ProcessInstance p = processEngine.getExecutionService().startProcessInstanceByKey("jbpm_decision",map);
            
            String taskId = processEngine.getTaskService()
                .createTaskQuery()
                .processInstanceId(p.getId())
                .uniqueResult()
                .getId();
            
            System.out.println(taskId);
            //办理业务
            processEngine.getTaskService().completeTask(taskId);
        }

    分支(fork)/聚合(join)活动:

    流程图:

    从图中:可以看出两条分支(发货、汇款)是同时进行的。并且只有当两条分支都到达join活动,流程才会继续向后执行,

    测试:

    @Test
        public void test()
        {
            //获取流程引擎
            ProcessEngine processEngine = Configuration.getProcessEngine();
            
            //发布流程实例
            processEngine.getRepositoryService()
                .createDeployment()
                .addResourceFromClasspath("com/jbpm_forjion/jbpm_forjion.jpdl.xml")
                .addResourceFromClasspath("com/jbpm_forjion/jbpm_forjion.png")
                .deploy();
            
            //启动流程实例
               processEngine.getExecutionService().startProcessInstanceByKey("jbpm_forjion");
        }
        
        //查看个人任务
        @Test
        public void taskQueryPersonel()
        {
            ProcessEngine processEngine = Configuration.getProcessEngine();
            TaskService taskService = processEngine.getTaskService();
            List<Task> list = taskService.createTaskQuery().list();
            for(Task t:list)
            {
                System.out.println("任务id:"+t.getId());
                System.out.println("任务名称:"+t.getName());
                System.out.println("任务操作人:"+t.getAssignee());
            }
            
            
        }
        
        @Test
        public void taskComplete()
        {
            //获取流程引擎
            ProcessEngine processEngine = Configuration.getProcessEngine();
            TaskService taskService = processEngine.getTaskService();
            taskService.completeTask("20001");
        }

    自定义活动(custion)

    流程图:

    实现 ExternalActivityBehaviour 接口:

    //到达这个活动是执行方法
        @Override
        public void execute(ActivityExecution aActivityExecution) throws Exception {        
            System.out.println("xxxxxxxxxxxxxxxx  execute  xxxxxxxxxxxxxxxxxx");
            //默认是执行完这个方法是 离开
            //aActivityExecution.takeDefaultTransition();
            //aActivityExecution.waitForSignal();
    
        }
    
        //调用signal 方法离开当前节点执行的方法(如果在execute() 方法中离开则不执行该方法)
        @Override
        public void signal(ActivityExecution arg0, String arg1, Map<String, ?> arg2) throws Exception {
            System.out.println("xxxxxxxxxxxxxxxxxx   signal   xxxxxxxxxxxxxxxxxxxxxx");
        }

    测试:

    @Test
        public void test()
        {
            //发布流程实例
            ProcessEngine processEngine = Configuration.getProcessEngine();
            processEngine.getRepositoryService()
                .createDeployment()
                .addResourceFromClasspath("com/jbpm_custom/jbpm_custom.jpdl.xml")
                .addResourceFromClasspath("com/jbpm_custom/jbpm_custom.png")
                .deploy();
            //启动流程实例
            ExecutionService executionService = processEngine.getExecutionService();
            ProcessInstance p = executionService.startProcessInstanceByKey("jbpm_custom");
            System.out.println(p.getId());
        }
        
        @Test
        public void signal()
        {
            //发布流程实例
            ProcessEngine processEngine = Configuration.getProcessEngine();
            ExecutionService executionService = processEngine.getExecutionService();
            executionService.signalExecutionById("jbpm_custom.30008");
        }

    事件:

    1、 在根元素或节点元素中,使用<on event=””> 元素指定事件,其中event属性代表事件的类型

    2、 在<on>中用子元素<enent-listener class=”EventListenerImpl”/> 指定处理类,要求指定的类要实现EventListener接口

    事件的类型

    1、 <on>元素在根元素<process> 中,可以指定enent为start、end。表示流程的开始于结束。

    2、 <on>元素在节点元素中,可以指定event为start、end.表示节点的进入与离开

    3、 在start 节点中只有end事件,在end 节点中只有start事件

    配置:

    <?xml version="1.0" encoding="UTF-8"?>
    
    <process name="jbpm_event" xmlns="http://jbpm.org/4.4/jpdl">
       
       <!-- 流程实例启动事件 -->
       <on event="start">
          <event-listener class="com.jbpm_event.EventListenerImpl"></event-listener>
       </on>
       <!-- 流程实例离开事件 -->
       <on event="end">
          <event-listener class="com.jbpm_event.EventListenerImpl"></event-listener>
       </on>
       
       <start name="start1" g="566,125,48,48">
          <transition name="to task1" to="task1" g="-63,-25"/>
       </start>
       
       <end name="end1" g="564,498,48,48"/>
       <task name="task1" g="577,294,92,52" assignee="员工">
          <transition name="to end1" to="end1" g="-62,-25"/>
          
           <!-- 进入活动事件 -->
           <on event="start">
              <event-listener class="com.jbpm_event.EventListenerImpl"></event-listener>
           </on>
           <!-- 离开活动事件 -->
           <on event="end">
              <event-listener class="com.jbpm_event.EventListenerImpl"></event-listener>
           </on>
       </task>
    </process>

     

     

     

     

     

     

  • 相关阅读:
    第三周:Filter 拦截用户请求部分代码分析
    Story Of Web Background
    XML的前景
    XML的工作原理和过程
    第二周:XML的定义和用途
    企业级应用与互联网应用的区别
    第一周:JavaEE——课程目标
    Java 容器小结
    使用java显示所有操作系统环境变量
    迭代器和Interator的常见用法
  • 原文地址:https://www.cnblogs.com/wujiaofen/p/10791255.html
Copyright © 2011-2022 走看看