0

在 jboss jBpm 中是否有可能获取在一个流程执行期间发生的所有转换?


用例是:我们现在想知道“用户”经历过的所有节点、任务节点……以及他们经历的过渡

这显示了从当前活动令牌/节点到开始任务之前已完成的任务实例列表。

一些不可行的想法已经探索过:

  • 获取活动令牌及其对应的节点,并通过到达的转换沿转换向上移动。这不起作用,因为可以传入多个转换,因此我们不知道已采用哪个转换。

可能我应该调查 JBPM_LOG 表,但我没有找到合适的方法 (API) 来查询它。也欢迎对任何在线文档提出任何建议。

注意:我们使用的是jBpm 版本:3.3.1

4

3 回答 3

0

是的,如果您需要获取转换,则需要使用 jbpm_log 表。要获得所有已处理的节点,您只需要 jbpm_taskInstance 表。我们使用 HQL 来获取所有用户的转换过程。我有一项关于“了解为给定任务实例选择的过渡用户”的任务。这不是做这种事情的明显方法,但我不能发明更清楚的东西。就我而言,这在应用程序中并不是一个非常常见的操作,因此它以“最快的编码”方式实现。显然,在您的情况下对单个任务实例进行 3 次查询不是一个好的选择。我需要的唯一文档是: http: //docs.jboss.org/jbpm/v3/javadoc/有关 Jbpm 类和包以及鉴别器的类列表的帮助:jbpm-jpdl.jar/org.jbpm.logging.log/ProcessLog.hbm.xml(有关于 jbpm 对象的描述 - DB 表映射)这是方法的代码。CriteriaSQL 是我们的 CriteriaParams 包装器。正如我所说,这不是最好的例子,但如果您需要,我还为 oracle DB 保存了普通的 sql 查询。

    private String getTaskTransition(LFTaskInstance instance) {     
        CriteriaSQL csql = new CriteriaSQL(new CriteriaParams());


        String query = "SELECT l " +
            " FROM org.jbpm.taskmgmt.log.TaskCreateLog l " +
            " WHERE l.taskInstance = " + instance.getId();      

        Query c =((HibernateSession)em).getHibernateSession().createQuery(csql.getQueryString(query));
        TaskCreateLog logEntry  = (TaskCreateLog) c.uniqueResult(); 
        int index = logEntry.getIndex();
        Long token = logEntry.getToken().getId();

        //Find bottom log index of transition which greater then log index of current instance creation
        String subQuery = "SELECT min(jbpmLog.index) " + 
                " FROM org.jbpm.graph.log.TransitionLog as jbpmLog " +
                " where jbpmLog.token = trLog.token AND " + //reference to query below
                        " jbpmLog.index > " + index; 

        //Find transition name from its Definition by log index of made transition
        query = " SELECT trans.name FROM org.jbpm.graph.def.Transition as trans " +
                " WHERE trans.id = " +
        " (SELECT min(transition.id) " +
        " FROM org.jbpm.graph.log.TransitionLog trLog " +
        " WHERE trLog.token = " + token + 
        "       and trLog.index = (" + subQuery + "))";

        c =((HibernateSession)em).getHibernateSession().createQuery(csql.getQueryString(query));
        return (String) c.uniqueResult();
    }
于 2009-08-14T10:19:21.690 回答
0

这适用于已经完成或部分处理的流程吗?如果没有,那么您可以在每个退出转换上放置一个操作处理程序,通过在当前标记中查找它来记录转换的名称。

于 2009-08-14T10:22:20.000 回答
0

我们像这样使用 sql select(登录到表 JBPM_LOG 必须在文件 jbpm.cfg.xml 中启用):

select distinct *
  from (select level,
               l.date_,
               pd1.name_ p1,
               n1.name_ n1,
               pd2.name_ p2,
               n2.name_ n2
          from juser.jbpm_log               l,
               juser.jbpm_node              n1,
               juser.jbpm_node              n2,
               juser.jbpm_processdefinition pd1,
               juser.jbpm_processdefinition pd2,
               juser.jbpm_token             t,
               juser.jbpm_processinstance   pi,
               juser.jbpm_token             t2
         where l.class_ = 'T'
           and n1.id_ = l.sourcenode_
           and n2.id_ = l.destinationnode_
           and n1.processdefinition_ = pd1.id_
           and n2.processdefinition_ = pd2.id_
           and t.id_ = l.token_
           and t.processinstance_ = pi.id_
           and pi.superprocesstoken_ = t2.id_
        connect by prior pi.id_ = t2.processinstance_
         start with pi.id_ =
                    (select id_
                       from (select pi.id_
                               from juser.jbpm_processinstance pi,
                                    juser.jbpm_token           t
                              where pi.superprocesstoken_ = t.id_
                             connect by prior t.processinstance_ = pi.id_
                              start with pi.id_ = <<<ID_OF_PROCESSINSTANCE>>>
                              order by pi.id_)
                      where rownum = 1)
         order by l.date_)
 order by date_;

这使用先验连接-我不知道这是否适用于甲骨文以外的任何东西。

于 2011-01-19T16:20:04.003 回答