在jboss jBpm中是否可以获取在一个进程执行期间已经执行的所有转换?
用例是:我们现在想要所有节点,任务节点,...... 用户'已经通过,以及他们采取了哪些过渡。
这将显示先前已从当前活动令牌/节点完成的任务实例列表,直到启动任务。
一些没有工作的想法已经探索过了:
可能我应该调查JBPM_LOG表,但是我没有找到一种正确的方法(API)来查询它。对任何在线文档的任何建议也是受欢迎的。
注意:我们使用 jBpm版本:3.3.1
答案 0 :(得分:0)
是的,如果需要转换,则需要使用jbpm_log表。要获取所有进行的节点,您只需要jbpm_taskInstance表。 我们使用HQL来完成所有用户的过渡。我有一个关于“知道转换用户为给定的taskInstance选择的任务”的任务。做这种事情并不是一个明显的方法,但我不能发明更清楚的东西。在我的情况下,它不是应用程序中非常常见的操作,因此它以“最快到代码”的方式实现。显然,在您的情况下对单个任务实例的3个查询不是一个好的选择。 我需要的唯一文档是:http://docs.jboss.org/jbpm/v3/javadoc/以获取有关Jbpm类和包以及discriminator的类列表的帮助:jbpm-jpdl.jar / org.jbpm.logging.log / ProcessLog.hbm.xml(关于jbpm对象的解释 - 数据库表映射) 这是方法的代码。 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();
}
答案 1 :(得分:0)
这是针对已经完成或部分处理的流程吗?如果没有,那么你可以在每个退出转换上放置一个动作处理程序,通过在当前令牌中查找它来记录转换的名称。
答案 2 :(得分: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_;
这使用先前连接 - 我不知道这是否适用于oracle以外的任何其他内容。