0

jboss jBpm で、1 つのプロセス実行中に行われたすべての遷移を取得することは可能ですか?


ユースケースは次のとおりです。「ユーザー」が通過したすべてのノード、タスクノード、およびそれらが行った遷移を取得したいと考えています。

これにより、現在アクティブなトークン/ノードから開始タスクまでに完了したタスク インスタンスのリストが表示されます。

いくつかの機能しないアイデアは、すでに検討されています:

  • アクティブなトークンとそれに対応するノードを取得し、到着する遷移を通じて遷移を上に移動します。複数のトランジションが着信する可能性があるため、これは機能しません。そのため、どのトランジションが行われたかはわかりません。

おそらく JBPM_LOG テーブルを調査する必要がありますが、これを照会する適切な方法 (API) が見つかりませんでした。オンライン ドキュメントへの提案も歓迎します。

注: jBpm バージョン:3.3.1を使用しています。

4

3 に答える 3

0

このようにsqlselectを使用します(テーブル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 に答える
0

はい、遷移を取得する必要がある場合は、jbpm_log テーブルを使用する必要があります。進行中のすべてのノードを取得するには、jbpm_taskInstance テーブルのみが必要です。HQL を使用して、プロセス中のすべてのユーザーの移行を取得します。「特定の taskInstance に対してどのトランジション ユーザーが選択したかを知る」というタスクがありました。そのようなことを行うのは明らかな方法ではありませんが、より明確なものを発明することはできません. 私の場合、これはアプリであまり一般的なアクションではないため、「最速のコード化」方法で実現されています。あなたの場合、単一のタスクインスタンスに対して明らかに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 に答える