工作流第五篇之流程引擎的建立
使用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);
}
}