JBPM4.4采用命令(org.jbpm.api.cmd.Command)设计模式作为其实现流程逻辑的核心思想,所有命令都需要实现Command接口,在这个接口提供的execute方法里面实现
逻辑。注意:每个命令都是一个独立的事务操作,即每个execute方法的实现都被一个Hibernate所包含。在jbpm4.4中给开发者留有很多的扩展空间,
比如这个Command命令就是其中之一,jbpm4.4实际上市鼓励开发者去定制自己的“用户命令”,去实现特定的业务需求,因为这个命令模式中可以使
开发者能在流程(因为在execute中有了Environment,有了它可以获得流程中的任何东西 )和业务之间进行穿梭,可以说是穿梭自由啊!
我感觉这个Command模式,大家可以定制一些查询的命令,如去根据条件查询一些JBPM4.4中的实现TaskImpl,ProcessDefinitionImpl等等。
一、Command接口的实现类:
/**
* 客户化任务查询
* @author yangtao
* @date 2011-8-17下午01:49:33
* @version 1.0
*/
public class CustomTaskQueryCommand implements Command<List<Task>> {
private int taskPriority;
private String taskDescLike;
private Date taskCreateFrom;
private Date taskCreateTo;
private int start;
private int limit;
private String userName;
//通过构造方法传入所需参数
public CustomTaskQueryCommand(int taskPriority,String taskDescLike,Date taskCreateFrom,Date taskCreateTo,int start,int limit,String userName){
this.taskPriority = taskPriority;
this.taskDescLike = taskDescLike;
this.taskCreateFrom = taskCreateFrom;
this.taskCreateTo = taskCreateTo;
this.start = start;
this.limit = limit;
this.userName = userName;
}
/* (non-Javadoc)
* @see org.jbpm.api.cmd.Command#execute(org.jbpm.api.cmd.Environment)
*/
@Override
public List<Task> execute(Environment environment) throws Exception {
// TODO Auto-generated method stub
Session session = environment.get(Session.class);
Criteria criteria = session.createCriteria(TaskImpl.class);
//增加查询的条件
if(this.taskPriority !=0 ){
criteria.add(Restrictions.eq("priority", this.taskPriority));
}
if(this.taskDescLike !=null ){
criteria.add(Restrictions.like("description", "%"+this.taskDescLike));
}
if(this.taskCreateFrom !=null&&this.taskCreateTo!=null ){
criteria.add(Restrictions.between("createTime", this.taskCreateFrom, this.taskCreateTo));
}
//这个增加的查询条件有点复杂,根据ParticipationImpl和TaskImpl的关系进行增加的
if(this.userName !=null){
List<Task> list = criteria.list();
for(Task task : list){
TaskImpl taskimpl = (TaskImpl)task;
Criteria criteria2 = session.createCriteria(ParticipationImpl.class);
criteria2.add(Restrictions.eq("userId", userName));
criteria2.add(Restrictions.eq("type", ParticipationImpl.CANDIDATE));
criteria2.add(Restrictions.eq("task", taskimpl));
List list2 = criteria2.list();
if(list2.size()==0){
criteria.add(Restrictions.ne("dbid", taskimpl.getDbid()));
}
}
}
//查询结果
List<Task> resultList = criteria.setFirstResult(start).setMaxResults(limit).list();
return resultList;
}
}
二、Command接口的调用:
Command<List<Task>> command = new CustomTaskQueryCommand(0,null,null,null,start,limit,userName);
List<Task> list = (List<Task>)processEngine.execute(command);
在调用的时候,可以通过Command接口实现类得构造方法传入一些必要的参数,然后在execute中调用jbpm中方法去查询,在这个例子中,我通过获得Hibernate的Criteria去增加
条件进行查询的。