前几天大家一直针对如何在项目中取得数据库连接进行了大量的讨论,其中提到了通过自己写Servlet在初始化时取得数据库连接来初始化内存中的内容。当时zhangjw说到这是一个野路子的处理方式,在emp中可以有多种方式进行初始化的操作。以系统启动时将数据库中的某张配置表信息缓存在内存中为例:
1、如果该系统是一个BS应用,那么可以实现initializer接口(com.ecc.emp.web.servlet.Initializer)。然后将该initializer的实现类配置在empServletContext.xml中:
<servletContext>
...
<sessionManager class="com.ecc.emp.session.EMPSessionManager"/>
<initializer class="com.yucheng.initializer.MyInitializer"/>
...
</servletContext>
而在initializer类中操作数据库时,可以有两种方式:
a、通过factoty.getContextName(factory.getRootContextName)取得RootContext,然后再通过ConnectionManager取得数据库连接进行处理
b、通过调用EMPFlow来执行初始化的操作:
Context rootContext = factory.getContextNamed(factory.getRootContextName());
EMPFlow flow = factory.getEMPFlow("yourBizId");
Context context = (Context)flow.getContext().clone();
context.chainedTo(rootContext);
EMPTransactionManager transactionManager = (EMPTransactionManager) context.getService(EMPConstance.TRX_SVC_NAME);
EMPTransaction transaction = transactionManager.getTransaction(new EMPTransactionDef(EMPTransactionDef.TRX_REQUIRED));
try{
flow.execute(context, "yourOpId");
transactionManager.commit(transaction);
}catch(Exception e){
transactionManager.rollback();
//handler the exception
}finally{
if(context != null)
context.terminate();
}
2、对于网关类应用,可以新建一个Service(扩展EMPService),然后实现一个initialize,并将该服务配置在公共服务中。其中initialize方法在emp2.2版本与之前的版本中略有不同,emp2.2版本中initialize拥有组件工厂的名称作为参数,如下面例子:
public void initialize(String factoryName){
EMPFlowComponentFactory factory = (EMPFlowComponentFactory) EMPFlowComponentFactory.getComponentFactory(factoryName);
//剩下的处理与initializer一样
}
而在emp2.1版本以及之前的版本中,initialize方法是没有任何参数的:
public void initialize(){
EMPFlowComponentFactory factory = (EMPFlowComponentFactory) EMPFlowComponentFactory.getComponentFactory("web.xml中配置的factoryName");
//剩下的处理与initializer一样
}
除此之外,在公共服务中配置该服务定义时,必须保证该服务必须处于其所需要的其它服务的下方,比如该服务应该定义在TransactionManager之后,如果用到某个TableDefine,那么也需要定义在该TableDefine后面,否则在初始化时将无法获得这些服务
package com.yucheng.emp.base;
import java.util.HashMap;
import java.util.Map;
import com.ecc.emp.component.factory.EMPFlowComponentFactory;
import com.ecc.emp.core.Context;
import com.ecc.emp.data.IndexedCollection;
import com.ecc.emp.data.KeyedCollection;
import com.ecc.emp.flow.EMPFlow;
import com.ecc.emp.web.servlet.Initializer;
/**
* 基础平台初始化配置信息处理类
* @author liujy
*/
public class BusinessInitializer implements Initializer{
/**
* 用户自定义初始化实现方法。
* @param factory EMP业务逻辑组件工厂
* @throws Exception
*/
public void initialize(EMPFlowComponentFactory factory) throws Exception{
EMPFlow flow;
Context context=null;
IndexedCollection iColl=null;
KeyedCollection kColl=null;
String key,value,apptype;
Context rootCtx=factory.getContextNamed(factory.getRootContextName());//从factory中获取rootContext
//加载系统配置信息到rootContext中
try{
System.out.println("=========加载系统配置信息(S_SYSCONFIG)到rootContext中========");
flow = factory.getEMPFlow("sysconfig");
context = (Context)flow.getContext().clone();
context.chainedTo(rootCtx);
flow.execute(context,"querySSysConfigList");
iColl=(IndexedCollection)context.getDataElement("sysconfigIColl");
Map hmSysConfig=new HashMap();
Map hm;
for(int i=0;i<iColl.size();i++){
kColl=(KeyedCollection)iColl.getElementAt(i);
apptype=(String)kColl.getDataValue("apptype");
if(hmSysConfig.get(apptype)==null){
hm=new HashMap();
hmSysConfig.put(apptype,hm);
}
else{
hm=(Map)hmSysConfig.get(apptype);
}
key=(String)kColl.getDataValue("syskey");
value=(String)kColl.getDataValue("sysvalue");
hm.put(key,value);
}
System.out.println("加载完成,共加载 "+iColl.size()+" 条系统配置记录.");
rootCtx.addDataField(BaseConstance.ATTR_SYSCONFIG, hmSysConfig);
}
catch(Exception e){
System.out.println("加载系统配置信息到rootContext中异常:");
e.printStackTrace();
}
finally{
if(context!= null)
context.terminate();
}
}
}