Activiti5第八弹,ProcessEngineConfiguration和ProcessEngine

ProcessEngineConfiguration

package org.mpc.final_activiti;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

import org.activiti.engine.ProcessEngineConfiguration;
import org.junit.Test;

public class ProcessEngineConfigurationTest {

	@Test
	public void test() throws FileNotFoundException {
		// 使用activiti默认的方式创建ProcessEngineConfiguration
		ProcessEngineConfiguration
				.createProcessEngineConfigurationFromResourceDefault();

		// 指定配置文件创建ProcessEngineConfiguration
		ProcessEngineConfiguration
				.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
		// 指定配置文件、ProcessEngineConfiguration在xml中的名称后来创建ProcessionEngineConfiguration
		/**
		 * 
		 * 上面的两种方法都是调用的第三种方法:p1内部自动指定了activiti.cfg.xml
		 * processEngineConfiguration p2内部自动指定了processEngineConfiguration
		 * 
		 * */
		ProcessEngineConfiguration
				.createProcessEngineConfigurationFromResource(
						"activiti.cfg.xml", "processEngineConfiguration");

		// 不使用默认的classresourceloader,而是通过定义文件的形式来创建ProcessEngineConfiguration
		File file = new File("src/main/resource/activiti.cfg.xml");
		InputStream in = new FileInputStream(file);
		ProcessEngineConfiguration
				.createProcessEngineConfigurationFromInputStream(in);
		// 在使用过后,流会自动关闭

		// 在流方式创建ProcessEngineConfiguration方式中也可以制定bean的名称
		in = new FileInputStream(file);
		ProcessEngineConfiguration
				.createProcessEngineConfigurationFromInputStream(in,
						"processEngineConfiguration");

		// 创建createStandaloneProcessEngineConfiguration 不会读取任何的外部配置文件
		// 所有属性都要在这个configuration中配置,而且很多属性都有默认值
		ProcessEngineConfiguration p4 = ProcessEngineConfiguration
				.createStandaloneProcessEngineConfiguration();
		System.out.println(p4.getDatabaseSchemaUpdate());
		System.out.println(p4.getDatabaseType());
		System.out.println(p4.getJdbcUrl());
		System.out.println(p4.getMailServerHost());

		// 创建createStandaloneInMemProcessEngineConfiguration
		// 他是前者createStandaloneProcessEngineConfiguration的子类,同样部会读取任何的外部配置文件,但是默认属性的值于父类不同
		// 一般用在测试过程中使用
		/**
		 * 
		 * public class StandaloneInMemProcessEngineConfiguration extends
		 * StandaloneProcessEngineConfiguration {
		 * 
		 * public StandaloneInMemProcessEngineConfiguration() {
		 * this.databaseSchemaUpdate = DB_SCHEMA_UPDATE_CREATE_DROP;
		 * this.jdbcUrl = "jdbc:h2:mem:activiti"; } }
		 * */
		ProcessEngineConfiguration p5 = ProcessEngineConfiguration
				.createStandaloneInMemProcessEngineConfiguration();
		System.out.println(p5.getDatabaseSchemaUpdate());
		System.out.println(p5.getJdbcUrl());
	}
}



ProcessEngine


package org.mpc.final_activiti;

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

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.ProcessEngineInfo;
import org.activiti.engine.ProcessEngines;
import org.junit.Test;

public class ProcessEngineTest {

	@Test
	public void test() {
		// 通过ProcessEngineConfiguration来创建ProcessEngine
		ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration
				.createProcessEngineConfigurationFromResourceDefault();
		ProcessEngine p1 = processEngineConfiguration.buildProcessEngine();

		/**
		 * 
		 * ProcessEngines 的 init 方法
		 * 该方法会读取Activiti的默认配置文件,然后创建ProcessEngine实例缓存到Map中
		 * 
		 * */
		// 初始化ProcessEngines的Map
		// 再加载Activiti默认的配置文件 classpath 下的 activiti.cfg.xml 文件
		// 如果是与spring整合了,则读取 classpath 下的 activiti-context.xml文件
		ProcessEngines.init();
		Map<String, ProcessEngine> map = ProcessEngines.getProcessEngines();
		System.out.println(map.size());
		System.out.println(map.get("default"));
		ProcessEngine p2 = map.get("default");

		/**
		 * 
		 * registerProcessEngine 和 unregister 方法
		 * 
		 * */
		/**
		 * 
		 * 在使用processEngineConfiguration.buildProcessEngine()以及ProcessEngines.
		 * init()的时候,都会默认调用registerProcessEngine
		 *
		 * 所以这里在inti之后输出map的size(),是1
		 * */
		System.out.println(map.size());
		/**
		 * 
		 * 然后移除了这个engine
		 * 
		 * */
		ProcessEngines.unregister(p2);
		// 把p1注册进去后输出一下map的大小
		ProcessEngines.registerProcessEngine(p1);
		System.out.println(map.size());
		Iterator<Entry<String, ProcessEngine>> ito = map.entrySet().iterator();
		Entry<String, ProcessEngine> en = ito.next();
		// 这里的key是default,init 和 buildprocessengine 创建的ProcessEngine的名称都是default
		System.out.println("key---->" + en.getKey() + "value-------->"
				+ en.getValue());
		System.out.println();

		/**
		 * 
		 * retry()方法
		 * 如果Activiti在加载配置文件的时候出现异常,则可以调用ProcessEngines的retry方法重新加载配置文件
		 * ,重新创建ProcessEngine实例并加入到Map中
		 * 
		 * */

		// 获得资源文件的URL实例
		ClassLoader loader = ProcessEngines.class.getClassLoader();
		URL url = loader.getResource("activiti.cfg.xml");
		ProcessEngines.unregister(p1);
		Map<String, ProcessEngine> map1 = ProcessEngines.getProcessEngines();
		System.out.println("retry之前的map1的大小------" + map1.size());
		// 得到流程实例保存对象
		ProcessEngineInfo info = ProcessEngines.retry(url.toString());
		System.out.println(info.toString() + "<----------------------------->"
				+ info.getException() + "<>" + info.getName() + "<>"
				+ info.getResourceUrl());
		map1 = ProcessEngines.getProcessEngines();
		System.out.println("retry之后的map1的大小------" + map1.size());

		/**
		 * 
		 * destroy()方法 对ProcessEngines所维护的所有ProcessEngine实例进行销毁,并且在销毁的同时调用
		 * ProcessEngine的close()方法
		 * 
		 * */
		System.out.println("destroy之前的map1的大小------" + map1.size());
		ProcessEngines.destroy();
		map1 = ProcessEngines.getProcessEngines();
		System.out.println("destroy之后的map1的大小------" + map1.size());

		/**
		 * 
		 * ProcessEngine 的 close() 方法
		 * 
		 * */

		p2.close();

		/**
		 * 
		 * 流程引擎的名称
		 * 
		 * */
		processEngineConfiguration.setProcessEngineName("mpc_test");
		ProcessEngine p3 = processEngineConfiguration.buildProcessEngine();
		System.out.println(p3.toString());
		ProcessEngine p4 = ProcessEngines.getProcessEngine("mpc_test");
		System.out.println(p4.toString());
		System.out.println(ProcessEngines.getProcessEngines().size());

		/**
		 * 
		 * ProcessEngines 的
		 * getDefaultProcessEngine()方法,返回名称为default的ProcessEngine
		 * 
		 * 如果ProcessEngines没有初始化,那么就执行init()方法
		 * 
		 * */

		ProcessEngine p = ProcessEngines.getDefaultProcessEngine();
		System.out.println(p.getName());
	}

}


用到的两个配置文件

avtiviti5.cfg.xml


<?xml version="1.0"?>
<beans default-lazy-init="false"
	xsi:schemaLocation=" http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jee="http://www.springframework.org/schema/jee"
	xmlns:util="http://www.springframework.org/schema/util" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://www.springframework.org/schema/beans">
	<!-- DBCP数据库 -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
		<property name="url" value="jdbc:mysql://localhost:3306/activi1"></property>
		<property name="username" value="root"></property>
		<property name="password"  value="root"></property>
	</bean>
	<!--processEngineConfiguration-->
	<bean class="org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration"
		id="processEngineConfiguration">
		
		
		<!-- 数据库配置方式一:直接使用jdbc的各种属性来配置,全部交给了activiti 
		         <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activi1" />
		         <property name="jdbcDriver" value="com.mysql.jdbc.Driver" /> 
		         <property name="jdbcUsername" value="root" />
		         <property name="jdbcPassword" value="root" /> 
		  -->

		<!-- 数据库配置方式二:将数据库的各种配置交给DBCP,然后activiti只配置DBCP数据库 -->
		<property name="dataSource" ref="dataSource"></property>
	

		<!-- 邮箱相关配置 START-->
		<property name="mailServerHost" value="smtp.163.com" />
		<property name="mailServerPort" value="25" />
		<property name="mailServerUsername" value="15203437412"></property>
		<property name="mailServerPassword" value="xxx"></property>
		<property name="mailServerDefaultFrom" value="15203437412@163.com"></property>
		<!-- 邮箱相关配置 END -->

		<!-- 
		设置流程引擎启动和关闭时数据库执行的策略
		有一下三个值:
		false Activiti在启动时,会对比数据库中保存的版本,如果没有表或者版本不匹配,将在启动时抛出异常。
		true Activiti在启动时,会对数据库中所有表进行更新,如果表不存在,则Activiti会自动创建。
		create-drop Activiti在启动时会执行表的创建工作,在关闭时会执行表的删除工作。
		 -->
		<property name="databaseSchemaUpdate" value="true" />
		<!-- 制定要使用的数据库类型 -->
		<property name="databaseType" value="mysql"></property>
		<!-- 启动或关闭jobexecutor -->
		<property name="jobExecutorActivate" value="true" />
		<!-- 
		保存流程相关的历史数据
		 none 不保存任何历史数据,因此在流程执行中,这是最高效的。      																					    0
		 activity 级别高于none,保存流程实例与流程行为,其他数据不保存。  																					    1
		 audit 在前者的基础上,还会保存全部的流程任务极其属性。       																						2 
		 full 保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。   3
		 -->
		<property name="history" value="full"></property>
	</bean>
</beans>


my_config.xml


<?xml version="1.0"?>
<beans default-lazy-init="false"
	xsi:schemaLocation=" http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jee="http://www.springframework.org/schema/jee"
	xmlns:util="http://www.springframework.org/schema/util" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://www.springframework.org/schema/beans">
	<!-- DBCP数据库 -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
		<property name="url" value="jdbc:mysql://localhost:3306/activi1"></property>
		<property name="username" value="root"></property>
		<property name="password"  value="root"></property>
	</bean>
	<!--processEngineConfiguration-->
	<bean class="org.mpc.final_activiti.MyProcessEngineConfiguration"
		id="myProcessEngineConfiguration">
		
		
		<!-- 数据库配置方式一:直接使用jdbc的各种属性来配置,全部交给了activiti 
		         <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activi1" />
		         <property name="jdbcDriver" value="com.mysql.jdbc.Driver" /> 
		         <property name="jdbcUsername" value="root" />
		         <property name="jdbcPassword" value="root" /> 
		  -->

		<!-- 数据库配置方式二:将数据库的各种配置交给DBCP,然后activiti只配置DBCP数据库 -->
		<property name="dataSource" ref="dataSource"></property>
	

		<!-- 邮箱相关配置 START-->
		<property name="mailServerHost" value="smtp.163.com" />
		<property name="mailServerPort" value="25" />
		<property name="mailServerUsername" value="15203437412"></property>
		<property name="mailServerPassword" value="xxx"></property>
		<property name="mailServerDefaultFrom" value="15203437412@163.com"></property>
		<!-- 邮箱相关配置 END -->

		<!-- 
		设置流程引擎启动和关闭时数据库执行的策略
		有一下三个值:
		false Activiti在启动时,会对比数据库中保存的版本,如果没有表或者版本不匹配,将在启动时抛出异常。
		true Activiti在启动时,会对数据库中所有表进行更新,如果表不存在,则Activiti会自动创建。
		create-drop Activiti在启动时会执行表的创建工作,在关闭时会执行表的删除工作。
		 -->
		<property name="databaseSchemaUpdate" value="true" />
		<!-- 制定要使用的数据库类型 -->
		<property name="databaseType" value="mysql"></property>
		<!-- 启动或关闭jobexecutor -->
		<property name="jobExecutorActivate" value="true" />
		<!-- 
		保存流程相关的历史数据
		 none 不保存任何历史数据,因此在流程执行中,这是最高效的。      																					    0
		 activity 级别高于none,保存流程实例与流程行为,其他数据不保存。  																					    1
		 audit 在前者的基础上,还会保存全部的流程任务极其属性。       																						2 
		 full 保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。   3
		 -->
		<property name="history" value="full"></property>
		<!-- 这是我自定义的processEngineConfiguration中的一个属性,在这里进行注入 -->
		<property name="name"    value="mpc_test"></property>
	</bean>
</beans>



posted @ 2015-01-24 11:31  qz程程  阅读(810)  评论(0编辑  收藏  举报