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

  • 相关阅读:
    定位属性position,相对定位,绝对定位
    flex弹性盒模型?
    vue生命周期
    理解cookie、session、token
    前端兼容性问题
    JS 如何为一个元素怎么绑定多个事件?
    js数组的操作方法
    vue页面翻页勾选的记忆功能
    Vue中nextTick的正确使用
    Vue用router.push(传参)跳转页面,参数改变,跳转页面数据不刷新的解决办法
  • 原文地址:https://www.cnblogs.com/Byrd/p/2735963.html
Copyright © 2020-2023  润新知