2009-08-14 50 views
0

是否有可能在jboss jBpm中獲取一個進程執行過程中所有的轉換?在jBpm中,如何獲取流/流程中所有的轉換?


的使用情況是:我們想現在所有的節點,tasknodes,...這用戶「已經通過並過渡他們把。

這將顯示先前從當前活動令牌/節點到開始任務完成的任務實例列表。

一些不工作思路已經探索:

  • 採取積極令牌及其相應的節點,並通過轉變到達旅遊達的轉換。由於多重轉換可以傳入,所以這不起作用,所以我們不知道已經進行了哪個轉換。

也許我應該調查JBPM_LOG表,但是我沒有找到正確的方法(API)來查詢它。對任何在線文檔的任何建議也將受到歡迎。

注:我們所使用的jBPM 版本:3.3.1

+0

您可以發佈(作爲回答或評論)您的解決方案嗎? – Vanger 2009-08-14 20:32:24

+0

@Vangar,我會寫一次,我可能會在下個星期寫下它。 – HeDinges 2009-08-15 16:27:00

回答

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對象的描述 - 數據庫表映射) 這是該方法的代碼。 CriteriaSQL是我們的CriteriaParams包裝器。 正如我所說這不是最好的例子,但我也保存了Oracle數據庫的普通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(); 
    } 
0

這是針對已經完成或部分處理的流程嗎?如果沒有,那麼你可以在每個退出轉換上放置一個動作處理器,通過在當前令牌中查找來記錄轉換的名稱。

+0

這是一個新的系統,所以可以這樣做,但我仍然沒有必要設計具有特定操作處理程序的所有流程和未來流程。同樣,我可以將其記錄在我的應用程序服務方法中。我的首選方式仍然使用標準的jbpm功能。但是,您的解決方案應該可以正常工作。 – HeDinges 2009-08-14 10:56:53

+0

我從一個生產站點在這裏有一個完整的JBPM數據庫,看起來唯一的方法是篩選日誌。但是,在我的JBPM實現中,我使用JBPM作爲執行工作流程工作的手段,同時我將所有有關工作流的數據存儲在我自己的表中,並且運行良好。 – Zoidberg 2009-08-14 11:24:39

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之外。