/**
* Copyright 1996-2014 FoxBPM ORG.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* @author kenshin
* @author ych
*/
package org.foxbpm.engine;
import java.util.HashMap;
import java.util.Map;
public abstract class ProcessEngineManagement {
public static final String NAME_DEFAULT = "default";
public static final String NAME_DESIGNER = "designer";
protected static boolean isInitialized = false;
protected static Map<String, ProcessEngine> processEngines = new HashMap<String, ProcessEngine>();
/**
* 注册一个流程引擎 获取一系列包含工作流方法Services。
* ProcessEngine和服务对象都是线程安全的,因此你可以在整个服务器中保留对它们任何一个的引用。
*
* @param processEngine
*/
public static void registerProcessEngine(ProcessEngine processEngine) {
processEngines.put(processEngine.getName(), processEngine);
}
/**
* 注销的流程引擎。
*
* @param processEngine
* 流程引擎实例
*/
public static void unregister(ProcessEngine processEngine) {
processEngines.remove(processEngine.getName());
}
/**
* 获取默认的流程引擎
*
* @return 流程引擎实例
*/
public static ProcessEngine getDefaultProcessEngine() {
return getProcessEngine(NAME_DEFAULT);
}
/**
* 初始化流程引擎管理器
*/
public synchronized static void init(String processEngineName) {
if (!isInitialized) {
if (processEngines == null) {
processEngines = new HashMap<String, ProcessEngine>();
}
ProcessEngineConfiguration.createProcessEngineConfiguration(processEngineName)
.setProcessEngineName(NAME_DEFAULT).buildProcessEngine();
isInitialized = true;
} else {
// 记录日志
}
}
/**
* 获取流程引擎
*
* @param processEngineName
* 流程引擎名称
* @return 流程引擎实例
*/
public static ProcessEngine getProcessEngine(String processEngineName) {
if (!isInitialized) {
init(processEngineName);
}
return processEngines.get(processEngineName);
}
/**
* 关闭所有的流程引擎。
*/
public synchronized static void destroy() {
if (isInitialized) {
Map<String, ProcessEngine> engines = new HashMap<String, ProcessEngine>(processEngines);
processEngines = new HashMap<String, ProcessEngine>();
for (String processEngineName : engines.keySet()) {
ProcessEngine processEngine = engines.get(processEngineName);
try {
processEngine.closeEngine();
} catch (Exception e) {
// 抛出异常
}
}
isInitialized = false;
}
}
/**
* 手工设置引擎初始化状态,手工初始化时使用
* 引擎初始化部分存在问题,需要重构
* 问题1.内部调用引擎方式是否不应该从getDefaultEngine
* 问题2.是否应该支持多引擎操作方式
* 问题3.多引擎时,dbUtils等很多地方会出现问题,因为都是从默认引擎拿配置。是否考虑改成线程副本形式。
*/
public static void setInit(){
isInitialized = true;
}
}