1. 程式人生 > >Activiti入門教程三(詳解流程引擎配置)

Activiti入門教程三(詳解流程引擎配置)

     在先前的部落格中提到了有關ProcessEngineConfiguration建立,但並沒有詳細的解釋,主要建立的幾個方法,那麼這篇部落格就來談一談有關ProcessEngineConfiguration一些建立操作。

    ProcessEngineConfiguration類

     該類代表一個Activiti流程引擎的配置,提供了一系列靜態方法,用來讀取和解析相應的配置檔案,並返回ProcessEngineConfiguration的例項。下面來介紹一下有關建立例項的方法。

public static ProcessEngineConfiguration createProcessEngineConfigurationFromResourceDefault() {

    return createProcessEngineConfigurationFromResource("activiti.cfg.xml", "processEngineConfiguration");

  }

     正如原始碼所示,該方法預設讀取classpath下面的activiti.cfg.xml配置檔案,啟動並獲取名稱為processEngineConfiguration的bean的例項,然後解析XML後就由spring來例項完成。

public static ProcessEngineConfiguration createProcessEngineConfigurationFromResource(String resource) {

    return createProcessEngineConfigurationFromResource(resource, "processEngineConfiguration");

  }

     正如原始碼所示,該方法預設讀取classpath下面指定名稱的XML配置檔案,關鍵在於傳入的String型別的resource引數,跟上面類似,指定的bean的id名稱為processEngineConfiguration

public static ProcessEngineConfiguration createProcessEngineConfigurationFromResource(String resource, String beanName) {

    return BeansConfigurationHelper.parseProcessEngineConfigurationFromResource(resource, beanName);

  }

     正如原始碼所示,讀取我們自己命名的XML檔案,並且bean的名稱也可以由我們自己指定。例如我建立一個名稱為my-activiti2.xml,裡面的內容如下

<span style="font-family:Comic Sans MS;font-size:18px;"><?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans.xsd">

	<!-- 配置自定義屬性 -->
	<bean id="processEngineConfiguration" class="org.crazyit.activiti.MyConfiguration">
		<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti" />
		<property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
		<property name="jdbcUsername" value="root" />
		<property name="jdbcPassword" value="" />
		<property name="databaseSchemaUpdate" value="drop-create"></property>
		<property name="userName" value="crazyit"></property>
	</bean>

</beans>
</span>

public static ProcessEngineConfiguration createProcessEngineConfigurationFromInputStream(InputStream inputStream, String beanName) {

    return BeansConfigurationHelper.parseProcessEngineConfigurationFromInputStream(inputStream, beanName);

  }

     正如原始碼所示,xml檔案以一種輸入流的形式進行輸入,後面的引數就不再講解了,不同點就是xml的讀取方式變為了輸入流的形式,如下

<span style="font-family:Comic Sans MS;font-size:18px;">package org.crazyit.activiti;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Map;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.ProcessEngines;


public class CreateInputStream {

	public static void main(String[] args) throws Exception {
		File file = new File("resource/input-stream.xml");
		// 得到檔案輸入流
		InputStream fis = new FileInputStream(file);
		// 使用createProcessEngineConfigurationFromInputStream方法建立ProcessEngineConfiguration
		ProcessEngineConfiguration config = ProcessEngineConfiguration
				.createProcessEngineConfigurationFromInputStream(fis);
	}

}</span>
public static ProcessEngineConfiguration createStandaloneProcessEngineConfiguration() {
    return new StandaloneProcessEngineConfiguration();
  }

     正如原始碼所示,這個方法過於簡單,就是直接通過new來建立物件,關於資料庫的一系列操作,還得通過程式碼手動來賦值,如下所示

<span style="font-family:Comic Sans MS;font-size:18px;">@Test
	public void createTable(){
	
		ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
		//定義連線mysql資料庫
		configuration.setJdbcDriver("com.mysql.jdbc.Driver");
		configuration.setJdbcUrl("jdbc:mysql://localhost:3306/activiti?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8");
		configuration.setJdbcUsername("root");
		configuration.setJdbcPassword("");
		/**
		 * 	  public static final String DB_SCHEMA_UPDATE_FALSE = "false";操作activiti23張表的時候,如果表不存在,就丟擲異常,不能自動建立23張表
  
			  public static final String DB_SCHEMA_UPDATE_CREATE_DROP = "create-drop";每次操作,都會先刪除表,再建立表
			
			  public static final String DB_SCHEMA_UPDATE_TRUE = "true";如果表不存在,就建立表,如果表存在,就直接操作
		 */
		configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
		//activiti核心物件(流程引擎)
		ProcessEngine processEngine = configuration.buildProcessEngine();
		System.out.println("processEngine:"+processEngine);
	}</span>

     ProcessEngineConfiguration類的結構圖


    正如上圖所示,ProcessEngineConfiguration是全部配置類的父類,有一個ProcessEngineConfigurationImpl子類,ProcessEngineConfigurationImpl下面有三個直接的子類,其中ProcessEngineConfiguration和ProcessEngineConfigurationImpl都是抽象類

     瞭解了ProcessEngineConfiguration類的結構後,我們也可以自定義屬於我們自己的引擎配置,只要繼承抽象類ProcessEngineConfigurationImpl即可,如下所示

<span style="font-family:Comic Sans MS;font-size:18px;">package org.crazyit.activiti;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.activiti.engine.impl.interceptor.CommandContextInterceptor;
import org.activiti.engine.impl.interceptor.CommandInterceptor;


public class MyConfiguration extends ProcessEngineConfigurationImpl {
	
	public MyConfiguration() {
		// 做自定義設定
	}
	
	//測試屬性,需要在processEngineConfiguration注入
	private String userName;
	
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getUserName() {
		return this.userName;
	}

	//返回命令攔截器集合
	protected Collection<? extends CommandInterceptor> getDefaultCommandInterceptorsTxRequired() {
	    List<CommandInterceptor> defaultCommandInterceptorsTxRequired = new ArrayList<CommandInterceptor>();
	  //定義一個攔截器,該攔截器為系統內建攔截器,用於執行SQL指令碼
	    defaultCommandInterceptorsTxRequired.add(new CommandContextInterceptor(commandContextFactory, this));
	    return defaultCommandInterceptorsTxRequired;
	}

	//返回命令攔截器集合
	protected Collection<? extends CommandInterceptor> getDefaultCommandInterceptorsTxRequiresNew() {
		return super.commandInterceptorsTxRequired;
	}

}
</span>