Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在jBpm中,如何获取流/流程中的所有转换?_Java_Jbpm - Fatal编程技术网

Java 在jBpm中,如何获取流/流程中的所有转换?

Java 在jBpm中,如何获取流/流程中的所有转换?,java,jbpm,Java,Jbpm,在jboss jBpm中,是否可以获取在一个进程执行过程中执行的所有转换 用例是:我们希望现在所有节点、任务节点。。。“用户”经历了哪些转变以及他们采取了哪些转变 这将显示从当前活动令牌/节点到开始任务之前已完成的任务实例列表 已经探讨了一些不可行的想法: 获取活动令牌及其对应的节点,并通过到达的转换向上移动。这不起作用,因为可能会传入多个转换,所以我们不知道采取了哪个转换。 也许我应该研究JBPM_日志表,但我没有找到一种合适的API查询方法。欢迎对任何在线文档提出任何建议 注意:我们使用的是

在jboss jBpm中,是否可以获取在一个进程执行过程中执行的所有转换

用例是:我们希望现在所有节点、任务节点。。。“用户”经历了哪些转变以及他们采取了哪些转变

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

已经探讨了一些不可行的想法:

获取活动令牌及其对应的节点,并通过到达的转换向上移动。这不起作用,因为可能会传入多个转换,所以我们不知道采取了哪个转换。 也许我应该研究JBPM_日志表,但我没有找到一种合适的API查询方法。欢迎对任何在线文档提出任何建议


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

是的,如果需要获得转换,则需要使用jBpm_日志表。要获取所有继续的节点,您只需要jbpm_taskInstance表。 我们使用HQL来获取过程中所有用户的转换。我有一个任务要知道用户为给定的taskInstance选择了哪个转换。这不是一个明显的方式来做这样的事情,但我不能发明更清楚的东西。在我的例子中,这在应用程序中不是一个非常常见的操作,所以它是以最快的方式实现的。显然,在您的案例中,对单个任务实例进行3次查询不是一个好的选择。 我需要的唯一文档是:有关Jbpm类和包的帮助以及discriminator的类列表: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();
    }

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

我们像这样使用sql select登录到表JBPM\u日志必须在文件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_;

这使用了connect by Previor-我不知道这是否适用于oracle以外的任何其他系统。

这是一个新系统,因此可以这样做,但我仍然不必使用特定的操作处理程序设计所有流和未来流。类似地,我可以将其记录在我的应用程序服务方法中。我的首选方式仍然是使用标准的jbpm功能。但是,是的,你的解决方案应该可以很好地工作。我这里有一个完整的JBPM数据库,它来自一个生产站点,看起来唯一的方法就是筛选日志。然而,在我的JBPM实现中,我使用JBPM作为一种方式来完成工作流的繁重工作,同时我将有关工作流的所有数据存储在我自己的表中,并且效果很好。请您将您的解决方案作为答案或注释发布出来,好吗?@Vangar,我将在写完后发布,可能是下周的某个地方。