`

jbpm 常用代码及 jbpm IdentityService 扩展

    博客分类:
  • jbpm
 
阅读更多
一、流程定义
1.部署流程定义
   ProcessEngine processEngine = new Configuration().buildProcessEngine();
   RepositoryService repositoryService = processEngine.getRepositoryService();

例:布署文件中的流程
   //布署当前目录下pd.jpdl.xml文件
   String deploymentId = repositoryService.createDeployment()
                         .addResourceFromClasspath("pd.jpdl.xml").deploy();

例:布署网页上TextArea中的流程
   <form action="jbpm?family168=deploy" method="post">
    <textarea name="xml" cols=50 rows=15></textarea>
    <input type="submit" value="发布"/>
    <input type="reset" value="取消"/>
   </form>
   在后台处理如下:
   String xml = request.getParameter("xml");
   repositoryService.createDeployment()
                    .addResourceFromString("process.jpdl.xml", xml).deploy();

2.删除流程定义
   类ProcessDefinition 包含如下属性:
       ID:流程定义ID号
       DeploymentId:流程定义的布署ID号
       Key:关键字
       name:流程名
       version:版本号
  
   数据如下
       ID         Key      名称     版本
       hello-1     hello     hello     1

   //获取类ProcessDefinition的属性ID
   String id = request.getParameter("id");
   //根据流程ID获取流程定义实例
   ProcessDefinition pd = repositoryService.createProcessDefinitionQuery()
                          .processDefinitionId(id).uniqueResult();
   //根据流程定义的布署ID号,删除该流程定义
   //注意:jbpm4是不允许直接根据流程定义的ID来直接删除流程定义的,因为还要删除其它配置数据
   repositoryService.deleteDeploymentCascade(pd.getDeploymentId());

3.获取全部流程定义
根据流程名获取所有流程定义
   List<ProcessDefinition> processDefinitions = repositoryService
    .createProcessDefinitionQuery().orderAsc( ProcessDefinitionQuery.PROPERTY_NAME).list();

还可以根据以下顺序进行排序(org.jbpm.api.ProcessDefinitionQuery)
public static final java.lang.String     PROPERTY_DEPLOYMENT_TIMESTAMP     "deployment.timestamp"
public static final java.lang.String     PROPERTY_ID     "idProperty.stringValue"
public static final java.lang.String     PROPERTY_KEY     "keyProperty.stringValue"
public static final java.lang.String     PROPERTY_NAME     "idProperty.objectName"
public static final java.lang.String     PROPERTY_VERSION     "versionProperty.longValue"

二、流程实例

1.启动一个流程实例
1.1根据key启动流程实例
   用户必须为新启动的流程实例分配一个key, 这个key是用户执行的时候定义的且唯一。通常在业务流程领域找到这种key。 比如,一个订单id或者一个保险单号。
   ProcessInstance processInstance = executionService.startProcessInstanceByKey("ICL", "CL92837");

   key可以用来创建流程实例的id, 格式为{process-key}.{execution-id}。 所以上面的代码会创建一个id为 ICL.CL92837的流向 (execution)。

1.2根据数据库主键启动流程实例
   如果没有提供用户定义的key,数据库就会把主键作为key。 这样可以使用如下方式获得id:
   ProcessInstance processInstance =       executionService.startProcessInstanceByKey("ICL");
   String pid = processInstance.getId();
   最好使用一个用户定义的key。提供给一个用户定义的key, 你可以组合流向的id,而不是执行一个基于流程变量的搜索 - 那种方式太消耗资源了。

1.3根据变量启动流程实例
   为一个新的流程实例启动时就提供一组对象参数。 将这些参数放在variables变量里, 然后可以在流程实例创建和启动时使用。
   Map<String,Object> variables = new HashMap<String,Object>();
   variables.put("customer", "John Doe");
   variables.put("type", "Accident");
   variables.put("amount", new Float(763.74));
   ProcessInstance processInstance = executionService.startProcessInstanceByKey("ICL", variables);

   参见流程定义4-1,把order作为一个流程变量分配给它,启动新流程实例代码如下:
   Map<String, Object> variables = new HashMap<String, Object>();
   variables.put("order", new Order("johndoe"));
   ProcessInstance processInstance = executionService.startProcessInstanceByKey("TaskAssignee", variables);
  



2.根据流程定义,查看流程实例
   根据类ProcessDefinition的属性ID,查看该流程的所有实例
   String pdId = request.getParameter("id");
   return executionService.createProcessInstanceQuery()
          .processDefinitionId(pdId).list();

3.执行实例
   根据类ProcessInstance的属性ID,执行流程实例
   String pid = request.getParameter("pid");
   executionService.signalExecutionById(pid);

四.任务
假设流程定义4-1如下:
<process name="TaskAssignee">
   <start>
      <transition to="review" />
   </start>
   <task name="review" assignee="#{order.owner}">
      <transition to="work" />
   </task>
   <task name="review" assignee="johndoe">
      <transition to="wait" />
   </task>
   <state name="wait"/>
</process>

assignee="johndoe"
   表示任务会被分配给用户ID为"johndoe"的人。
assignee="#{order.owner}"
   任务被分配给#{order.owner}。表示通过Order对的getOwner()方法会用来获得用户id,该用户负责完成这个任务。
public class Order implements Serializable {
   String owner; public Order(String owner) {
      this.owner = owner;
   }
   public String getOwner() {
      return owner;
   }
   public void setOwner(String owner) {
      this.owner = owner;
   }
}

1.获取任务列表
1.1根据用户ID获取任务列表
   List<Task> taskList = taskService.findPersonalTasks("johndoe");

1.2根据任务候选人或候选组获取任务列表
   任务可能被分配给一组用户。 其中的一个用户应该接受这个任务并完成它。
   candidate-groups:一个使用逗号分隔的组id列表。 所有组内的用户将会成为这个任务的候选人。
   candidate-users:一个使用逗号分隔的用户id列表。 所有的用户将会成为这个任务的候选人。
   例如:
   <task name="review" candidate-groups="sales-dept">
      <transition to="wait" />
   </task>
   假设:sales-dept有两个成员:johndoe和joesmoe

   这个任务被创建时,不显示在任何人的个人任务列表中。 下面的任务列表会是空的。
   taskService.getAssignedTasks("johndoe");
   taskService.getAssignedTasks("joesmoe");

   分组任务列表中,用户接口必须只接受对这些任务的“接受”操作。
   taskService.takeTask(task.getDbid(), "johndoe");
   当一个用户接受了一个任务,这个任务的分配人就会变成当前用户。任务会从所有候选人的分组任务列表中消失,它会出现在用户的已分配列表中。

1.3在一个列表中显示该某人的所有任务
   包括他的个人任务,候选任务,这时直接用jbpm4提供的api完成不了该功能要求。于是可以使用以下方式进行扩展:
    /**
         * 取得用户的对应的任务列表
         * @param userId
         * @return
         */
        public List<TaskImpl> getTasksByUserId(String userId){
            AppUser user=(AppUser)getHibernateTemplate().load(AppUser.class, new Long(userId));
            Iterator<AppRole> rolesIt=user.getRoles().iterator();
            StringBuffer groupIds=new StringBuffer();
           int i=0;
           while(rolesIt.hasNext()){
               if(i>0)groupIds.append(",");
               groupIds.append("'"+rolesIt.next().getRoleId().toString()+"'");
           }
           /**
            * select * from `jbpm4_task` task
               left join jbpm4_participation pt on task.`DBID_`=pt.`TASK_`
               where task.`ASSIGNEE_`='1' or ( pt.`TYPE_` = 'candidate' and (pt.`USERID_`='1')
               or pt.`GROUPID_`in ('1'))
            */
           StringBuffer hqlSb=new StringBuffer();
           hqlSb.append("select task from org.jbpm.pvm.internal.task.TaskImpl task left join task.participations pt where task.assignee=?");
           hqlSb.append(" or (pt.type = 'candidate' and ((pt.userId=?)");
            
           if(user.getRoles().size()>0){
               hqlSb.append(" or (pt.groupId in ("+groupIds.toString()+"))");
           }
           hqlSb.append("))");
           hqlSb.append(" order by task.priority desc");
    
           return findByHql(hqlSb.toString(), new Object[]{userId,userId});
            
       }

2分配任务
   如果在流程定义文件中将任务指定到了个人,则jbpm自动分配给个人。否则需要进行指定
2.1给用户组的用户分配任务
流程定义文件:
   <task name="review" candidate-groups="sales-dept">
      <transition to="wait" />
   </task>
   假设:sales-dept有两个成员:johndoe和joesmoe

   分组任务列表中,用户接口必须只接受对这些任务的“接受”操作。
   taskService.takeTask(task.getDbid(), "johndoe");
   当一个用户接受了一个任务,这个任务的分配人就会变成当前用户。任务会从所有候选人的分组任务列表中消失,它会出现在用户的已分配列表中。

2.2任务分配处理器分配任务
   一个AssignmentHandler可以通过编程方式来计算 一个任务的分配人和候选人。
   public interface AssignmentHandler extends Serializable {  
      void assign(Assignable assignable, OpenExecution execution) throws Exception;
   }
   Assignable是任务和泳道的通用接口。 所以任务分配处理器可以使用在任务, 也可以用在泳道中。

包含任务分配处理器的流程定义4-2如下:
<process name="TaskAssignmentHandler" xmlns="http://jbpm.org/4.2/jpdl">
   <start g="20,20,48,48">
      <transition to="review" />
   </start>
   <task name="review" g="96,16,127,52">
      <assignment-handler class="org.jbpm.examples.task.assignmenthandler.AssignTask">
         <field name="assignee">
            <string value="johndoe" />
         </field>
      </assignment-handler>
      <transition to="wait" />
</task>
<state name="wait" g="255,16,88,52" />
</process>

类AssignTask代码如下:
public class AssignTask implements AssignmentHandler {
   String assignee;
   public void assign(Assignable assignable, OpenExecution execution) {
      assignable.setAssignee(assignee);
   }
}
   请注意,默认AssignmentHandler实现可以使用使用流程变量,任何其他Java API可以访问资源,像你的应用数据库来计算分配人和候选人用户和组。
   启动一个TaskAssignmentHandler的新流程实例,会立即让新流程实例运行到任务节点。 一个新review任务被创建,在这个时候 AssignTask的分配处理器被调用。这将设置johndoe为分配人。 所以John Doe将在他自己的任务列表中找到这个任务。

2.3给泳道分配任务
任务泳道如下面的流程文件4-3:
<process name="TaskSwimlane" xmlns="http://jbpm.org/4.2/jpdl">
<swimlane name="sales representative" candidate-groups="sales-dept" />
<start>
    <transition to="enter order data" />
</start>
<task name="enter order data" swimlane="sales representative">
    <transition to="calculate quote"/>
</task>
<task name="calculate quote" swimlane="sales representative">
</task>
</process>

在这个例子中,我们在身份组件中 创建了下面的信息:
   identityService.createGroup("sales-dept");
   identityService.createUser("johndoe", "johndoe", "John", "Doe");
   identityService.createMembership("johndoe", "sales-dept");

   在启动一个新流程实例后,用户johndoe将成为 enter order data的一个候选人。还是像上一个流程候选人例子一样, John Doe可以像这样接收任务:
   taskService.takeTask(task.getDbid(), "johndoe");

   接收这个任务将让johndoe成为任务的负责人。 直到任务与泳道sales representative关联, 分配人johndoe也会关联到泳道中作为负责人。接下来,John Doe可以像下面这样完成任务:
   taskService.completeTask(taskDbid);

   完成任务会将流程执行到下一个任务, 下一个任务是calculate quote。 这个任务也关联着泳道。因此, 任务会分配给johndoe。

=========================================================
IdentityService 扩展

将jbpm.identity.cfg.xml 放入到classpath下

编写实现类:
public class DefIdentitySessionImpl implements IdentitySession {
}

然后修改 jbpm.identity.cfg.xml 文件
内容如下:
<jbpm-configuration>

  <transaction-context>
    <object class="com.eoe.workflow.util.DefIdentitySessionImpl" />
  </transaction-context>

</jbpm-configuration>

分享到:
评论

相关推荐

    JBPM4 java源代码分包详解JBPM4

    【JBPM4 Java源代码分包详解】 JBPM4是一个流行的开源工作流管理系统,它提供了一整套用于设计、执行和管理业务流程的工具。在深入研究JBPM4的源代码时,我们可以从其包结构中了解到框架的核心功能和设计理念。 1....

    Jbpm源代码分包详解

    通过以上分析,我们可以看出Jbpm的源代码分包设计是高度模块化的,每个包都有明确的职责,使得系统易于扩展和维护。开发者可以根据自己的需求,深入研究和定制这些包中的类和接口,以适应特定的业务场景。

    jbpm3.2.3 要用jar包

    8. **jbpm-human-task-service.jar**:针对人类参与的任务管理,提供与任务相关的服务,如任务分配、任务通知等。 9. **jbpm-gwt-console-server.jar**/ **jbpm-gwt-console-client.jar**:这两者是jbpm的Web控制台...

    jbpm4.4基本语法

    7. **IdentityService对象**:IdentityService 是身份认证服务,用于处理流程中的用户、用户组和组成员关系。它可以用来管理用户权限和角色分配。 在JBPM4.4中,流程活动主要分为两类:控制活动和自动活动。 - **...

    JBPM帮助文档供大家学习

    org.jbpm.api.identity User and Group interfaces related to the IdentityService org.jbpm.api.job Job, Message and Timer interfaces related to the ManagementService org.jbpm.api.jpdl specific jPDL ...

    JBPM5.3 API+USERGUID

    4. **IdentityService**: 负责用户和组的管理,它对接口提供了身份验证和授权的功能,确保了流程操作的安全性。 5. **RepositoryService**: 接触到流程定义的存储库,可以部署新的流程定义,查询已部署的流程定义,...

    jBPM4与Spring整合的2种方式

    4. **配置其他Service**:除了RepositoryService,还需要配置TaskService、ExecutionService和IdentityService等,以便于操作任务、流程实例和用户身份信息。 5. **注入Service到业务逻辑**:通过Spring的@Autowired...

    JBPM4介绍开发步骤简介

    6. **IdentityService**:身份认证服务接口,用于管理流程用户、用户组及其成员关系,确保流程执行的安全性和合规性。 通过以上介绍,可以看出JBPM4不仅提供了强大的流程管理和执行能力,还考虑到了流程安全和历史...

    JBPM5 Spring 例子

    -- 其他服务配置如:processService, identityService, executionService等 --&gt; ``` 在这个例子中,我们使用了JTA事务管理器,并为各个服务配置了事务拦截器,确保业务操作的原子性。 接下来,我们需要创建流程...

    jbpm4服务接口方法汇总

    5. **IdentityService**:管理用户身份认证和授权。 6. **ManagementService**:监控和管理运行时的进程。 #### RepositoryService详解 **RepositoryService**提供了与流程定义相关的多种操作。这包括部署、更新、...

    jBPM5.2API文档

    5. **IdentityService**: 管理用户和组的信息,用于权限控制和任务分配。 6. **ExecutionService**: 直接操作流程执行,如信号发送、节点跳转等。 **jbPM5.2 API的主要功能** 1. **流程部署**: 通过...

    JBPM4__工作流.pptx

    - **IdentityService**:身份认证服务接口,提供对流程用户的认证及相关服务。 #### 六、流程活动类型 - **Start**:整个流程的起始节点,每个流程实例都从这里开始。一个流程定义必须包含一个 start 活动,且该...

    专题资料(2021-2022年)Activiti5基于jBPM4的开源工作流系统10分钟入门指南.doc

    同时,Activiti 提供了丰富的API和服务,如任务服务(taskService)用于处理用户任务,历史服务(historyService)用于追踪流程的历史记录,以及身份服务(identityService)用于管理用户和组。 总的来说,Activiti...

    基于Activiti的工作流开发.pdf

    Activiti的主要特点包括其生命周期模型,流程模型,流程定义,运行实例,历史信息等,以及提供的七大服务组件:RepositoryService、RuntimeService、TaskService、IdentityService、ManagementService、...

    ACTIVITI 5.1完整压缩包

    6. **Identity Service**:用于管理用户、组以及它们之间的关系。这是权限控制和任务分配的基础。 7. **Form Service**:ACTIVITI支持表单集成,允许用户在流程中填写和提交表单。这部分提供了表单模型的创建和渲染...

    Activiti6.0教程例子下载

    5. IdentityService: Activiti中内置了用户以及组管理的功能,必须使用这些用户和组的信息才能获取到相应的Task。IdentityService提供了对Activiti 系统中的用户和组的管理功能。 6. ManagementService: Management...

    SSO__单点登录__微软解决方案__设计文档.rar

    SSO(Single Sign-On)单点登录是一种身份验证机制,允许用户在一...如果你对SSO、CAS(Central Authentication Service)或JBPM(Java Business Process Management)有进一步的兴趣,这个文档将提供宝贵的参考资料。

    Activiti数据库表结构(整理后).docx

    表名的第二部分用两个字母表明表的用例,基本上跟Service API匹配。 Activiti数据库表分类 Activiti数据库表可以分为五个类别: * ACT_GE_*:通用表,用于各种情况下。 * ACT_HI_*:历史表,用于保存历史数据,...

Global site tag (gtag.js) - Google Analytics