如何在系统启动时处理非平台的初始化操作
2009-04-12 23:16
661 查看
前几天大家一直针对如何在项目中取得数据库连接进行了大量的讨论,其中提到了通过自己写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();
}
}
}
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();
}
}
}
相关文章推荐
- Android平台,如何调用javascript操作网页和js调用系统功能
- 介绍Linux系统如何初始化和启动系统服务的
- 批处理启动vm虚拟机服务 vm12启动无界面启动vm虚拟机系统 windows上如何操作服务 sc net启动关闭服务
- 介绍Linux系统开机如何初始化和启动系统服务
- 系统启动时自动跳出网页如何处理
- 系统启动时报错提示:bootMGR is missing如何处理
- 如何处理win7 64位系统登录进程初始化失败故障
- 通过分析exevc系统调用处理过程来理解Linux内核如何装载和启动一个可执行程序
- 介绍Linux系统如何初始化和启动系统服务的(Linux的开机流程)
- 介绍Linux系统如何初始化和启动系统服务的(Linux的开机流程)
- java应用中,调用第三方api如何处理异常(系统异常、操作异常等等)
- fabric-samples中first-network如何启动并手动进行查询,交易和初始化操作的简单做法
- 介绍Linux系统如何初始化和启动系统服务的
- Android平台,如何调用javascript操作网页和js调用系统功能
- 介绍Linux系统如何初始化和启动系统服务的(Linux的开机流程)
- 硬件初始化,nand flash固化操作,系统启动简单流程
- Android平台,如何调用javascript操作网页和js调用系统功能
- Android平台,如何调用javascript操作网页和js调用系统功能
- linux系统初始化——启动脚本是如何工作的
- 如何优雅的在Spring容器启动完成后进行资源初始化