1. 程式人生 > 其它 >工作流第五篇之流程引擎的建立

工作流第五篇之流程引擎的建立

技術標籤:activitiactiviti

使用ProcessEngineConfiguration的create方法可以建立ProcessEngineConfiguration的例項。buildProcessEngine方法會根據這些配置,初始化流程引擎的相關服務和物件,包括資料來源、事務、攔截器、服務元件等。
ProcessEngineConfiguration的buildProcessEngine
建立build_engine.xml配置檔案

<?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.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/act" /> <property name="jdbcDriver" value="com.mysql.jdbc.Driver" /> <property name="jdbcUsername"
value="root" /> <property name="jdbcPassword" value="root" /> <property name="databaseSchemaUpdate" value="true"/> </bean> </beans>

日誌log4j

# Set root category priority to INFO and its only appender to CONSOLE.
log4j.rootCategory=INFO, CONSOLE
#log4j.rootCategory=INFO, CONSOLE, LOGFILE

# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE

# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1} - %m%n


log4j.logger.org.apache=INFO
log4j.logger.org.htmlparser=INFO
log4j.logger.org.htmlparser=INFO
log4j.logger.com.angus=INFO

測試

package org.crazyit.activiti;

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

/**
 * 使用ProcessEngineConfiguration的buildProcessEngine方法
 * 
 * @author yangenxiong
 * 
 */
public class BuildProcessEngine {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// 讀取配置
		ProcessEngineConfiguration config = ProcessEngineConfiguration
				.createProcessEngineConfigurationFromResource("build_engine.xml");
		// 建立ProcessEngine
		ProcessEngine engine = config.buildProcessEngine();
	}

}

總結:buildProcessEngine方法會根據這些配置,初始化流程引擎的相關服務和物件,包括資料來源、事務、攔截器、服務元件等。這個流程引擎的初始化過程,實際上可以被看作一個配置檢查的過程。

ProcessEngines物件
init方法與getDefaultProcessEngine方法

package org.crazyit.activiti;

import java.util.Map;

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

/**
 * 呼叫ProcessEngines的init方法
 * 
 * @author yangenxiong
 * 
 */
public class Init {

	public static void main(String[] args) {
		// 初始化ProcessEngines的Map,
		// 再載入Activiti預設的配置檔案(classpath下的activiti.cfg.xml檔案)
		// 如果與Spring整合,則讀取classpath下的activiti-context.xml檔案
		ProcessEngines.init();
		// 得到ProcessEngines的Map
		Map<String, ProcessEngine> engines = ProcessEngines.getProcessEngines();
		System.out.println(engines.size());
		System.out.println(engines.get("default"));
	}

}

registerProcessEngine方法和unregister方法

package org.crazyit.activiti;

import java.util.Map;

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

/**
 * 註冊與登出ProcessEngine例項
 * @author yangenxiong
 *
 */
public class Register {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//讀取自定義配置
		ProcessEngineConfiguration config = ProcessEngineConfiguration.
				createProcessEngineConfigurationFromResource("register.xml");
		//建立ProcessEngine例項
		ProcessEngine engine = config.buildProcessEngine();
		//獲取ProcessEngine的Map
		Map<String, ProcessEngine> engines = ProcessEngines.getProcessEngines();
		System.out.println("註冊後引擎數:" + engines.size());
		//登出ProcessEngine例項
		ProcessEngines.unregister( engine);
		System.out.println("呼叫unregister後引擎數:" + engines.size());
	}

}

在這裡插入圖片描述retry方法

package org.crazyit.activiti;

import java.net.URL;
import java.util.Map;

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

/**
 * 使用ProcessEngines的retry方法
 * @author yangenxiong
 *
 */
public class Retry {

	public static void main(String[] args) {
		//得到資原始檔的URL例項
		ClassLoader cl = Retry.class.getClassLoader();
		URL url = cl.getResource("retry.xml");
		//呼叫retry方法建立ProcessEngine例項
		ProcessEngineInfo info = ProcessEngines.retry(url.toString());
		//得到流程例項儲存物件
		Map<String, ProcessEngine> engines = ProcessEngines.getProcessEngines();
		System.out.println("呼叫retry方法後引擎數:" + engines.size());
	}

}

destroy方法

package org.crazyit.activiti;

import java.net.URL;
import java.util.Map;

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

/**
 * 使用ProcessEngines的destroy方法
 * 
 * @author yangenxiong
 *
 */
public class Destroy {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// 進行初始化並且返回預設的ProcessEngine例項
		ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
		System.out.println("呼叫getDefaultProcessEngine方法後引擎數量:"
				+ ProcessEngines.getProcessEngines().size());
		// 呼叫銷燬方法
		ProcessEngines.destroy();
		// 最終結果為0
		System.out.println("呼叫destroy方法後引擎數量:"
				+ ProcessEngines.getProcessEngines().size());

		// 得到資原始檔的URL例項
		ClassLoader cl = Destroy.class.getClassLoader();
		URL url = cl.getResource("activiti.cfg.xml");
		// 呼叫retry方法建立ProcessEngine例項
		ProcessEngines.retry(url.toString());
		System.out.println("只調用 retry方法後引擎數量:"
				+ ProcessEngines.getProcessEngines().size());
		// 呼叫銷燬方法,沒有效果
		ProcessEngines.destroy();
		System.out.println("呼叫destory無效果,引擎數量:"
				+ ProcessEngines.getProcessEngines().size());
	}

}

總結:ProcessEngines是一個建立流程引擎與關閉流程引擎的工具類,所有建立(包括其他方式建立)的ProcessEngine例項均被註冊到ProcessEngines中。這裡所說的註冊,實際上是在ProcessEngines類中維護一個Map物件,該物件的key為ProcessEngine例項的名稱,value為ProcessEngine的例項,當向ProcessEngines註冊ProcessEngine例項時,實際上是呼叫Map的put方法,將該例項快取到Map中。

ProcessEngine物件
一個ProcessEngine主要有以下例項。
➢ RepositoryService:提供一系列管理流程定義和流程部署的API。
➢ RuntimeService:在流程執行時對流程例項進行管理與控制。
➢ TaskService:對流程任務進行管理,例如任務提醒、任務完成和建立任務等。
➢ IdentityService:提供對流程角色資料進行管理的API,這些角色資料包括使用者組、使用者及它們之間的關係。
➢ ManagementService:提供對流程引擎進行管理和維護的服務。
➢ HistoryService:對流程的歷史資料進行操作,包括查詢、刪除這些歷史資料。
➢ DynamicBpmnService:使用該服務,可以不需要重新部署流程模型,就可以實現對流程模型的部分修改。

package org.crazyit.activiti;

import org.activiti.engine.DynamicBpmnService;
import org.activiti.engine.HistoryService;
import org.activiti.engine.IdentityService;
import org.activiti.engine.ManagementService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;

/**
 * 獲取各個業務元件例項
 * @author yangenxiong
 *
 */
public class GetService {

	public static void main(String[] args) {
		//讀取流程引擎配置
		ProcessEngineConfiguration config = ProcessEngineConfiguration.
				createProcessEngineConfigurationFromResource("service.xml");
		//建立流程引擎
		ProcessEngine engine = config.buildProcessEngine();
		//得到各個業務元件例項
		RepositoryService repositoryService = engine.getRepositoryService();
		RuntimeService runtimeService = engine.getRuntimeService();
		TaskService taskService = engine.getTaskService();
		IdentityService identityService = engine.getIdentityService();
		ManagementService managementService = engine.getManagementService();
		HistoryService historyService = engine.getHistoryService();
		DynamicBpmnService dynamicBpmnService = engine.getDynamicBpmnService();
		// 輸入類名
		System.out.println(repositoryService.getClass().getName());
		System.out.println(runtimeService.getClass().getName());
		System.out.println(taskService.getClass().getName());
		System.out.println(identityService.getClass().getName());
		System.out.println(managementService.getClass().getName());
		System.out.println(historyService.getClass().getName());
		System.out.println(dynamicBpmnService.getClass().getName());
		
	}

}

關閉流程引擎

package org.crazyit.activiti;

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

/**
 * 呼叫 ProcessEngine的close方法
 * @author yangenxiong
 *
 */
public class Close {

	public static void main(String[] args) throws Exception {
		//讀取配置
		ProcessEngineConfiguration config = ProcessEngineConfiguration.
				createProcessEngineConfigurationFromResource("close.xml");
		//建立流程引擎
		ProcessEngine engine = config.buildProcessEngine();		
		System.out.println("完成流程引擎建立");
		Thread.sleep(10000);
		//執行close方法
		engine.close();
	}

}

流程引擎名稱

<?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.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
		<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/act" />
		<property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
		<property name="jdbcUsername" value="root" />
		<property name="jdbcPassword" value="root" />
		<property name="databaseSchemaUpdate" value="true"/>
	</bean>

</beans>

建立 log4j.properties 配置檔案

# Set root category priority to INFO and its only appender to CONSOLE.
log4j.rootCategory=INFO, CONSOLE
#log4j.rootCategory=INFO, CONSOLE, LOGFILE

# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE

# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1} - %m%n


log4j.logger.org.apache=INFO
log4j.logger.org.htmlparser=INFO
log4j.logger.org.htmlparser=INFO
log4j.logger.com.angus=INFO

測試

package org.crazyit.activiti;

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

/**
 * 流程引擎名稱
 * @author yangenxiong
 *
 */
public class Name {


	public static void main(String[] args) {
		ProcessEngineConfiguration config = ProcessEngineConfiguration.
				createProcessEngineConfigurationFromResource("name.xml");
		//設定流程引擎名稱
		config.setProcessEngineName("test");
		ProcessEngine engine = config.buildProcessEngine();
		//根據名稱查詢流程引擎
		ProcessEngine engineTest = ProcessEngines.getProcessEngine("test");
		System.out.println("建立的引擎例項:" + engine);
		System.out.println("查詢的引擎例項:" + engineTest);
	}

}