JBPM4.4中Command接口的应用

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去增加
条件进行查询的。

posted @ 2012-10-23 18:10  Byrd  阅读(441)  评论(0编辑  收藏  举报