流程資源可以是各種類型的文件,在啟動流程或流程實例運行過程中會被讀取。下面介紹常用的流程資源。
一、流程資源
流程定義文件:擴展名為bpmn20.xml和bpmn;
流程定義的圖片:用BPMN2.0規范的各種圖形描繪,一般用PNG的格式;
表單文件:把表單內容保存在一個文件中,其擴展名為drl;
規則文件:其擴展名為drl;
二、部署流程資源
部署流程資源有很多種方法,包括classpath、InputStream、字符串、zip格式壓縮包,下面將一一介紹。
1.classpath方式
public class ProcessDefinitionTest {
/**流程引擎(核心對象),默認加載類路徑下命名為activiti.cfg.xml*/
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//部署流程定義
@Test
public void deployementProcessDefinition(){
Deployment deployment = processEngine.getRepositoryService()//獲取流程定義和部署對象相關的Service
.createDeployment()//創建部署對象
.name("helloworld演示")//聲明流程的名稱
.addClasspathResource("diagrams/helloworld.bpmn")//加載資源文件,一次只能加載一個文件
.addClasspathResource("diagrams/helloworld.png")//
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());//1
System.out.println("部署時間:"+deployment.getDeploymentTime());
}
}
2.InputStream方式
使用InputStream方式部署流程資源需要傳入一個輸入流及資源的名稱,輸入流的來源不限,可以從classpath讀取,也可以從一個絕對路徑文件讀取,也可以是從網絡上讀取。
//Inputstream方式
@Test
public void deployementProcessDefinitionByInputStream() throws FileNotFoundException{
//獲取資源相對路徑
String bpmnPath = "diagrams/helloworld.bpmn";
String pngPath = "diagrams/helloworld.png";
//讀取資源作為一個輸入流
FileInputStream bpmnfileInputStream = new FileInputStream(bpmnPath);
FileInputStream pngfileInputStream = new FileInputStream(pngPath);
Deployment deployment = processEngine.getRepositoryService()//獲取流程定義和部署對象相關的Service
.createDeployment()//創建部署對象
.addInputStream("helloworld.bpmn",bpmnfileInputStream)
.addInputStream("helloworld.png", pngfileInputStream)
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());//1
System.out.println("部署時間:"+deployment.getDeploymentTime());
}
3.字符串方式
利用字符串方式可以直接傳入純文本作為資源的來源,和前兩種方式類似,字符串方式的實現原理是把一組字符串的內容轉化為字節流后再部署。
//字符串方式
@Test
public void deployementProcessDefinitionByString() throws FileNotFoundException{
//字符串
String text = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><definitions>...</definitions>";
Deployment deployment = processEngine.getRepositoryService()//獲取流程定義和部署對象相關的Service
.createDeployment()//創建部署對象
.addString("helloworld.bpmn",text)
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());//1
System.out.println("部署時間:"+deployment.getDeploymentTime());
}
4.zip/bar格式壓縮包方式
以上3種部署方式一次只能部署一個資源,除非執行多次deployment.addXxx()方法,如何一次部署多個資源呢?很簡單,是我們可以使用zip/bar格式壓縮包方式。將資源文件手動或使用Ant腳本,打包文件擴展名可以是Activiti官方推薦的bar或普通的zip。
//部署流程定義(zip)
@Test
public void deployementProcessDefinitionByzip(){
//從classpath路徑下讀取資源文件
InputStream in = this.getClass().getClassLoader().getResourceAsStream("diagrams/helloworld.zip");
ZipInputStream zipInputStream = new ZipInputStream(in);
Deployment deployment = processEngine.getRepositoryService()//獲取流程定義和部署對象相關的Service
.createDeployment()//創建部署對象
.addZipInputStream(zipInputStream)//使用zip方式部署,將helloworld.bpmn和helloworld.png壓縮成zip格式的文件
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());//1
System.out.println("部署時間:"+deployment.getDeploymentTime());
}
三、數據庫表變更
在部署流程定義這一步,數據庫中操作三張表:
1)ACT_RE_DEPLOYMENT(部署對象表)
存放流程定義的顯示名和部署時間,每部署一次增加一條記錄

2)ACT_RE_PROCDEF(流程定義表)
存放流程定義的屬性信息,部署每個新的流程定義都會在這張表中增加一條記錄。
注意:當流程定義的key相同的情況下,使用的是版本升級

3)ACT_GE_BYTEARRAY(資源文件表)
存儲流程定義相關的部署信息。即流程定義文檔的存放地。每部署一次就會增加兩條記錄,一條是關於bpmn規則文件的,一條是圖片的(如果部署時只指定了bpmn一個文件,activiti會在部署時解析bpmn文件內容自動生成流程圖)。兩個文件不是很大,都是以二進制形式存儲在數據庫中。

4)ACT_GE_PROPERTY(主鍵生成表)
主張表將生成下次流程部署的主鍵ID。

