jbpm4常用操作

JBPM4常用操作

一、流程定义

1.部署流程定义

ProcessEngine processEngine = new Configuration().buildProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService();

例:布署文件中的流程

//布署当前目录下pd.jpdl.xml文件

String deploymentId = repositoryService.createDeployment() .addResourceFromClasspath(\

例:布署网页上 TextArea中的流程

在后台处理如下:

String xml = request.getParameter(\ repositoryService.createDeployment()

.addResourceFromString(\

2.删除流程定义

类ProcessDefinition 包含如下属性: ID:流程定义ID号

DeploymentId:流程定义的布署ID号 Key:关键字 name:流程名 version:版本号 数据如下

ID Key 名称 版本 hello-1 hello hello 1

//获取类ProcessDefinition的属性ID String id = request.getParameter(\ //根据流程ID获取流程定义实例

ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() .processDefinitionId(id).uniqueResult();

//根据流程定义的布署ID号,删除该流程定义

//注意:jbpm4是不允许直接根据流程定义的ID来直接删除流程定义的,因为还要删除其它配置数据 repositoryService.deleteDeploymentCascade(pd.getDeploymentId());

3.获取全部流程定义

根据流程名获取所有流程定义

List processDefinitions = repositoryService

.createProcessDefinitionQuery().orderAsc( ProcessDefinitionQuery.PROPERTY_NAME).list();

还可以根据以下顺序进行排序 (org.jbpm.api.ProcessDefinitionQuery) public

static

final

java.lang.String PROPERTY_DEPLOYMENT_TIMESTAMP \public static final java.lang.String PROPERTY_ID \public static final java.lang.String PROPERTY_KEY \public static final java.lang.String PROPERTY_NAME \public static final java.lang.String PROPERTY_VERSION \

二、流程实例

1.启动一个流程实例 1.1根据key启动流程实例

用户必须为新启动的流程实例分配一个key, 这个key是用户执行的时候定义的且唯一。通常在业务流程领域找到这种key。 比如,一个订单id或者一个保险单号。

ProcessInstance processInstance = executionService.startProcessInstanceByKey(\

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

1.2 根据数据库主键启动流程实例

如果没有提供用户定义的key,数据库就会把主键作为key。 这样可以使用如下方式获得id: ProcessInstance processInstance = executionService.startProcessInstanceByKey(\ String pid = processInstance.getId();

最好使用一个用户定义的key。提供给一个用户定义的key, 你可以组合流向的id,而不是执行一个基于流程变量的搜索 - 那种方式太消耗资源了。

1.3根据变量启动流程实例

为一个新的流程实例启动时就提供一组对象参数。 将这些参数放在variables变量里, 然后可以在流程实例创建和启动时使用。

Map variables = new HashMap(); variables.put(\ variables.put(\

variables.put(\

ProcessInstance processInstance = executionService.startProcessInstanceByKey(\

参见流程定义4-1,把order作为一个流程变量分配给它,启动新流程实例代码如下: Map variables = new HashMap(); variables.put(\

ProcessInstance processInstance = executionService.startProcessInstanceByKey(\variables);

2. 根据流程定义,查看流程实例

根据类ProcessDefinition的属性ID,查看该流程的所有实例 String pdId = request.getParameter(\

return executionService.createProcessInstanceQuery() .processDefinitionId(pdId).list();

3.执行实例

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

假设流程定义4-1如下:

assignee=\

表示任务会被分配给用户ID为\的人。 assignee=\

任务被分配给#{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 taskList = taskService.findPersonalTasks(\

1.2根据任务候选人或候选组获取任务列表

任务可能被分配给一组用户。 其中的一个用户应该接受这个任务并完成它。

candidate-groups:一个使用逗号分隔的组id列表。 所有组内的用户将会成为这个任务的候选人。 candidate-users:一个使用逗号分隔的用户id列表。 所有的用户将会成为这个任务的候选人。 例如:

假设:sales-dept有两个成员:johndoe和joesmoe

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

分组任务列表中,用户接口必须只接受对这些任务的“接受”操作。 taskService.takeTask(task.getDbid(), \

当一个用户接受了一个任务,这个任务的分配人就会变成当前用户。任务会从所有候选人的分组任务列表中消失,它会出现在用户的已分配列表中。

1.3在一个列表中显示该某人的所有任务

包括他的个人任务,候选任务,这时直接用jbpm4提供的api完成不了该功能要求。于是可以使用以下方式进行扩展: /**

* 取得用户的对应的任务列表 * @param userId * @return */

public List getTasksByUserId(String userId){

AppUser user=(AppUser)getHibernateTemplate().load(AppUser.class, new Long(userId)); Iterator rolesIt=user.getRoles().iterator();

StringBuffer groupIds=new StringBuffer(); int i=0;

while(rolesIt.hasNext()){ if(i>0)groupIds.append(\

groupIds.append(\ } /**

* 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(\

task

from

org.jbpm.pvm.internal.task.TaskImpl

task

left

join

task.participations pt where task.assignee=?\

hqlSb.append(\

if(user.getRoles().size()>0){

hqlSb.append(\ }

hqlSb.append(\

hqlSb.append(\

return findByHql(hqlSb.toString(), new Object[]{userId,userId}); }

2分配任务

如果在流程定义文件中将任务指定到了个人,则jbpm自动分配给个人。否则需要进行指定 2.1给用户组的用户分配任务 流程定义文件:

假设:sales-dept有两个成员:johndoe和joesmoe

分组任务列表中,用户接口必须只接受对这些任务的“接受”操作。 taskService.takeTask(task.getDbid(), \

当一个用户接受了一个任务,这个任务的分配人就会变成当前用户。任务会从所有候选人的分组任务列表中消失,它会出现在用户的已分配列表中。

2.2任务分配处理器分配任务

一个AssignmentHandler可以通过编程方式来计算 一个任务的分配人和候选人。 public interface AssignmentHandler extends Serializable {

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4