1. 程式人生 > >Activiti實現流程定義的控制與修改

Activiti實現流程定義的控制與修改

Activiti提供的流程定義是基於XML的,一旦釋出完成後,若想對流程定義實現更改,只有一種辦法,就是重新發布新的版本,但有時,我們需要的是不讓他發行新版本,只是希望修改其原來的Xml,如我們對分支節點進行條件設定。

此文章借鑑了http://redxun.iteye.com/blog/2253074這篇博主的文章,但是他的方法並不能完全實現對流程的修改。在此,我經過改造現將實現過程寫下:

直接實現實現對流程定義的XML實現讀寫。只需要拿到流程定義的deployId或definitionId,通過對其act_ge_bytearray表實現更改,其定義內容存放於bytes_欄位中。

我們提供了對定義Xml檔案的更改方法:

private String modifyDeployId(Document doc) {
// TODO 手動修改流程定義

String deploymentId=Xml2Bean.selectElementText(doc, "//ContractRoot/SvcCont/ReqInfo/deploymentId");
String actDefId = Xml2Bean.selectElementText(doc, "//ContractRoot/SvcCont/ReqInfo/actDefId");
String deployNames=Xml2Bean.selectElementText(doc, "//ContractRoot/SvcCont/ReqInfo/deployNames");


        //把修改過的xml更新至迴流程定義中 
        writeDefXml(deploymentId,deployNames);
        //清除快取
        //String actdefId = "AREA_INTERNET_STATIC:2:697504";
        engineConfig.getProcessDefinitionCache().remove(actDefId);  
String respXml="<ContractRoot>"+ 
"<TcpCont>" + 
"<ResultCode>0</ResultCode>" + 
"<deploymentId>部署物件ID為"+deploymentId+" </deploymentId>" + 
"<actDefId>流程定義ID為"+actDefId+" </actDefId>" +
"</TcpCont>"+
"<ContractRoot>";
return respXml;
}

//取得流程定義的XML

private byte[] getDefXml(String deployNames) throws IOException{

InputStream in = BusiBizImpl.class.getResourceAsStream(deployNames);
        BufferedInputStream bis =null;
        ByteArrayOutputStream bos = null;
        try{
        bis =new BufferedInputStream(in);
        bos = new ByteArrayOutputStream();
        int buf_size = 1024;
        byte[] buffer = new byte[buf_size];
        int len;
        while(-1 !=(len = bis.read(buffer,0, buf_size))){
        bos.write(buffer, 0, len);
        }
        byte[] result =  bos.toByteArray();
        return result;
        } finally{
        if(bis != null)
        bis.close();
        if(bos != null)
        bos.close();
        }
}
public void writeDefXml(final String deploymentId, String deployNames) {  
        try {  
            LobHandler lobHandler = new DefaultLobHandler();  
            final byte[] btyesXml = getDefXml("/activity/" + deployNames);
            String sql = "update ACT_GE_BYTEARRAY set BYTES_=? where NAME_ LIKE '%.bpmn' and DEPLOYMENT_ID_= ? ";  
            jdbcTemplate.execute(sql, new AbstractLobCreatingPreparedStatementCallback(lobHandler) {  
                @Override  
                protected void setValues(PreparedStatement ps, LobCreator lobCreator) throws SQLException, DataAccessException {  
                    lobCreator.setBlobAsBytes(ps, 1, btyesXml);  
                    ps.setString(2, deploymentId);  
                }  
            });  
        } catch (Exception ex) {  
            ex.printStackTrace();  
        }  
    }  

修改前:

這個流程已經上生產了,本次修改了會籤節點的屬性,紅色下劃線是已經修改好的,由圖可見:本地流程已經更新。

資料庫的XML檔案:更新前:


更新後:


成功修改,無需從新發布流程!

測試方法:

1:在專案中修改Activiti的流程圖,此時XML檔案已經更新。

2:在act_re_procdef   表中找到需要修改的流程,這裡注意是最新版本的流程定義。 取到部署物件ID、流程定義ID、bpmn格式的流程名稱。

3::呼叫介面。實現更新

接觸工作流有一段時間了,一直沒時間更新部落格。如有碰到Activiti方面的問題,歡迎各位朋友共同學習進步。如有疑問,可通過163郵箱聯絡我:[email protected]

相關推薦

Activiti實現流程定義控制修改

Activiti提供的流程定義是基於XML的,一旦釋出完成後,若想對流程定義實現更改,只有一種辦法,就是重新發布新的版本,但有時,我們需要的是不讓他發行新版本,只是希望修改其原來的Xml,如我們對分支

C#實現appSettings節點讀取修改的方法

ffffff share 讀取 stat med modified 2-0 class exceptio 本文實例講述了C#實現appSettings節點讀取與修改的方法,分享給大家供大家參考。具體方法如下: 關鍵代碼如下: 代碼如下: public static s

[Python Study Notes]實現對鍵盤控制監控

實現 博客 pac rip art 字符串 line 一個 sys ‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘ >

高階函數:聲明、實現定義調用

bsp 函數 nbsp 參數 形式 高階函數 返回 開放性 其它 高階函數是以參量和返回值的形式引用其它函數的函數; 高階函數是開放的和變化的。 相對於基本函數來說,高階函數提供了可配置性、變化性、開放性。 聲明: 高階函數本身的聲明,引用函數的聲明; 為高階函數和引用

多資料庫下activiti流程定義快取問題

我們使用activiti(5.14版本)作為流程引擎,今天在產品中發現一個問題,某流程的審批記錄中, 活動例項表中記錄的活動名稱(ACT_HI_ACTINST表的ACT_NAME)竟然是該流程中不存在的活動名稱, 確認了該流程沒有被修改升級過。 後來發現了是activiti

Activiti技術流程的啟動終止

1、Activity流程啟動和終止的方法如下: /** * 通過 流程的key 啟動流程 * @param defintionkey * @param params 包含使用者id * @return

echarts 折線圖自定義顏色修改legend顏色

fff none split slab art 自定義顏色 series name har option4 = { title : { text: ‘‘, subtext: ‘‘ }, color:[‘#2db7f5‘,‘#ff

ACTIVITI 5.22.0 流程退回上一節點,實現多例項序列並行退回

import java.util.ArrayList; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util

【轉】WPF自定義控制元件樣式(11)-等待/忙/正在載入狀態-控制元件實現

一.前言   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等。   本文主要有三種實現方式: 簡單忙碌狀態控制元件BusyBox; Win8/win10效果忙碌狀態控制元件ProgressRing; 彈出非同步等待框WaitingB

擴充套件Activiti流程定義檔案,實現定義節點屬性

為了滿足業務需要,流程設計階段需對設計產物流程定義檔案中節點屬性進行擴充套件,譬如:任務是否支援退回、退回方式、退回的節點,任務轉派人、任務可跳轉的節點範圍等屬性資訊。為了保證擴充套件後的流程定義檔案能夠正常解析,我們採用類似<activiti:formProperty>元素的方式,模式如下:

定義MediaController來實現修改底部佈局作以及實現vedioview半屏全屏的切換

因為直接使用系統vedioview,底部的MediaController佈局有點不好看,尤其是進度條,不能實現辦半屏與全屏的切換,自己網上看了下別人的資料,整理了下,做以筆記;初學者,勉強才實現這些功能,還有許多地方不明白。 看下效果:                   

定義控制元件三部曲之動畫篇(十)——聯合動畫的XML實現使用示例

前言:不畏人生,或許才能方得始終;大膽拼,大膽闖是要有一定資本的,在能力不到的時候,就只有選擇忍氣吞聲! 上篇給大家講了有關AnimatorSet的程式碼實現方法,這篇我們就分別來看看如何利用xml來實現ValueAnimator、ObjectAn

第四章.流程控制數組

lean mage .cn nal ati alt 什麽 lan int 流程控制結構: 分支結構   根據分支條件來選擇性的執行某段代碼。   if:   switch:     case語句後面只能是byte、short、char、int四種整型類型,枚舉類型和Java

activiti自己定義流程之整合(四):整合自己定義表單部署流程定義

borde row ont 創建 source als dst art select 綜合前幾篇博文內容。我想在整合這一部分中應該會有非常多模塊會跳過不講,就如自己定義表單的表單列表那一塊,由於這些模塊在整合的過程中都差點兒沒有什麽修改,再多講也是反復無用功。

匿名類型Select方法實現定義對象插入局部表結構中

aso 直接 菜單 ember new order ber 構建 als 在提取局部表結構數據時,通過Select選取需要的字段,如下句,此時其實產生了一個不用於_menuMan的原新數據類型new { c.SYS_COMMANDS_ID,c.TXT_COMMANDTITL

流程控制數組

break 循環 .com b- 分支結構 mage 技術 選擇性 cas 1 兩種基本流程控制結構。 分支結構:用於實現根據條件選擇性的執行某段代碼 if switch 循環結構:根據循環條件重復執行某段代碼 while , do whi

asp.net[web.config] httphandlers 實現自由定義訪問地址

是什麽 test too gif cti lin 文件 我們 簡單的 http://www.cnblogs.com/PiaoMiaoGongZi/p/5216089.html 今天一起來看一個簡單的例子,主要是用來實現一個映射功能,我們一般訪問一個網址的時候比如是這樣的h

Activiti如何實現流程的回退

jpg tina eat complete 創建 key eve comment repos 1.概述流程回退一直以來是個老舊的難題,也一直沒有好的解決方法,本文就來詳述流程回退的解決辦法。首先我們來分析一下不同的流程審批情況,並在對應的節點上實現流程的回退處理,以及應該提

Django restframwork實現定義數據格式的分頁搜索

模糊 ces none ota ntp model 簡單的 api ner 最近因為在做分頁時遇到的問題很多,頁浪費了好多時間,所以記錄一下。以後如遇到可用省去不必要的麻煩 restframwork中的官方文檔對分頁和搜索頁進行了詳細的介紹,但是我公司需要的return的

《瘋狂Java講義》 4-流程控制數組

數據結構 也有 堆內存 種類型 引用 字符串 數組長度 問題 ret 總結 1、流程控制   和C++類似。   switch用的較少,留意一下:Java7後expression還可以是字符串類型。   switch與if不同,起始點非常清晰,故每個case的花括號可以省略