您的位置:首页 > 其它

初学activiti之流程引擎容器的初始化(一)-准备工作

2012-02-20 20:42 525 查看
org.activiti.engine包下有一个名为ProcessEngines的抽象类,我把它看做作流程引擎的容器,它持有所有注册在案流程引擎实例。



init和destory方法定义了它的生命周期。

init负责加载类路径下的名为activiti.cfg.xml或activiti-context.xml的资源文件,并用俩种不同的方式来初始化资源文件中所配置的流程引擎。

(1)普通(activiti.cfg.xml):initProcessEnginFromResource(resource)

注:这是个私有方法

调用关系:initProcessEnginFromResource---》

buildProcessEngine---》

ProcessEngineConfiguration.buildProcessEngine

真正干活(创建流程实例的)的是ProcessEngine类的buildProcessEngine

注:ProcessEngine类见后。

(2)借助spring:initProcessEngineFromSpringResource(resource)

注:这是个protected方法

protected static void initProcessEngineFromSpringResource(URL resource) {
try {
//加载SpringConfigurationHelper类到内存中
Class< ? > springConfigurationHelperClass = ReflectUtil.loadClass("org.activiti.spring.SpringConfigurationHelper");
// 通过反射得到buildProcessEngine方法
// 执行此方法,创建流程引擎实例
Method method = springConfigurationHelperClass.getMethod("buildProcessEngine", new Class<?>[]{URL.class});
method.invoke(null, new Object[]{resource});
} catch (Exception e) {
throw new ActivitiException("couldn't initialize process engine from spring configuration resource "+resource.toString()+": "+e.getMessage(), e);
}
}

从源码中可以看出,这个流程引擎的容器,在一个生命周期内只会被初始化一次。
public synchronized static void init() {
if (!isInitialized) {
if(processEngines == null) {
processEngines = new HashMap<String, ProcessEngine>();
............
............
............
}
} else {
log.info("Process engines already initialized");
}
}


init方法执行的时机(即容器初始化)
在第一次需要得到流程引擎实例时,整个容器开始初始化

public static ProcessEngine getProcessEngine(String processEngineName) {
if (!isInitialized) {
init();
}
return processEngines.get(processEngineName);


destroy,主要做关闭引擎实例,清理容器(对应的实例信息等),并对容器初始化标识(静态变量isInitialized)重置为false,至此一个流程引擎容器一个完整生命周期结束。

ProcessEngineConfiguration是一个抽象类,buildProcessEngine是它的一个模板方法 ,有待其不同的子类用不同的方式实现。

还有,它有很多不同的静态工厂方法,来代替构造器,以产生出不同的ProcessEngineConfiguration实例

干活人(创建流程引擎实的类):ProcessEngineConfigurationImpl

关于创建流程引擎实例:

public ProcessEngine buildProcessEngine() {
init();
return new ProcessEngineImpl(this);
}


这个方法就相当复杂了,也进入了正题。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: