EJB的HOME接口的高速缓存- -
公司的platform产品中用到了基于EJB的工作流,而platform每次调用工作流时,都是通过JNDI对home接口进行lookup,这个动作是很耗性能的,而以前竟然没有进行缓存,汗ing........,刚刚看到了Brett McLaughlin写的一篇<<EJB 最佳实践:工业强度的 JNDI 优化>> 于是赶紧改写了一个home接口的工厂类:
EJBHomeFactory.java
public class EJBHomeFactory {
private static Log log = Logger.getLog(EJBHomeFactory.class);
/**
* EJBHOME和JNDI参数,直接取得连接时使用
*/
private static final String WORKLIST_JNDI = "com.company.workflow.engine.worklist.Worklist";
private static final String WORKLIST_HOME = "com.company..workflow.engine.worklist.WorklistHome";
private static final String ADMIN_JNDI = "com.company.workflow.engine.admin.Admin";
private static final String ADMIN_HOME = "com.company..workflow.engine.admin.AdminHome";
private static final String DEFINITION_JNDI = "com.company..workflow.definition.Definition";
private static final String DEFINITION_HOME = "com.company..workflow.definition.DefinitionHome";
private static String url;
private static String userID;
private static String password;
private Map ejbHomes;
Context ctx;
/** 对象本身 */
private static EJBHomeFactory m_singleton;
static
{
url = Config.getString("workflow.jndi.provider.url", null);
userID = Config.getString("workflow.jndi.security.principal", null);
password = Config.getString("workflow.jndi.security.credentials", null);
}
protected EJBHomeFactory() throws NamingException,WorkflowApplicationException{
ctx = getInitialContext();
ejbHomes = Collections.synchronizedMap(new HashMap());
}
/**
* 返回唯一的静态对象(Singleton模式)
* @return EJBHomeFactory
* @throws NamingException 调用new InitialContext()失败时,返回嵌套了一个NamingException的工作流异常
*/
public static EJBHomeFactory getInstance() throws NamingException,WorkflowApplicationException{
if ( m_singleton == null)
m_singleton = new EJBHomeFactory();
return m_singleton;
}
public EJBHome lookUpHome(String jndiName,String homeName) throws NamingException,WorkflowApplicationException {
//先从缓存中取得home接口
EJBHome homeInterface = (EJBHome)ejbHomes.get(homeName);
//如果缓存中不存在,则用jndi进行查找
if (homeInterface == null)
{
try
{
Object obj = ctx.lookup(jndiName);
homeInterface =
(EJBHome)PortableRemoteObject.narrow(obj, Class.forName(homeName));
//将home接口放入缓存中
ejbHomes.put(homeName, homeInterface);
}
catch (Exception e)
{
log.error("查找home接口出错", e);
throw new WorkflowApplicationException("不能获得home接口:" +
e.getMessage());
}
}
return homeInterface;
}
private Context getInitialContext() throws WorkflowApplicationException
{
Context context = null;
try
{
Properties prop = new Properties();
prop.put(Context.INITIAL_CONTEXT_FACTORY,
Config.getString("workflow.jndi.factory.initial", null));
prop.put(Context.PROVIDER_URL,url);
if (userID != null)
{
prop.put(Context.SECURITY_PRINCIPAL, userID);
prop.put(Context.SECURITY_CREDENTIALS, password);
}
context = new InitialContext(prop);
}
catch (Exception e)
{
log.error("初始化服务context出错", e);
throw new WorkflowApplicationException(e.getMessage());
}
return context;
}
/**
* 获取Definition的Home接口
* @return Definition的Home接口
* @throws NamingException 如果发生工作流应用异常
*/
public final DefinitionHome getDefinitionHome() throws NamingException,WorkflowApplicationException{
return (DefinitionHome)m_singleton.lookUpHome(DEFINITION_JNDI,DEFINITION_HOME);
}
/**
* 获取Admin的Home接口
* @return Admin的Home接口
* @throws NamingException 如果发生工作流应用异常
*/
public final AdminHome getAdminHome() throws NamingException,WorkflowApplicationException{
return (AdminHome)m_singleton.lookUpHome(ADMIN_JNDI,ADMIN_HOME);
}
/**
* 获取Worklist的Home接口
* @return Worklist的Home接口
* @throws NamingException 如果发生工作流应用异常
*/
public final WorklistHome getWorklistHome() throws NamingException,WorkflowApplicationException{
return (WorklistHome)m_singleton.lookUpHome(WORKLIST_JNDI,WORKLIST_HOME);
}
分享到:
相关推荐
项目中用到的定时调用Ejb接口示例。在jboss下通过。需要依赖jbossall-client.jar包
Home接口是用来创建和查找EJB Object 接口; 组件接口是不同类型的EJB要求实现的指定的接口; 比如: 会话Bean, 实现SessionBean, 导致 Bean类依赖容器; 2) 可以使用注释来代替配置文件; 3) 简化访问EJB容器...
实战EJB 实战EJB 实战EJB 电子书 pdf
EJB方面EJB方面EJB方面EJB方面EJB方面
ejb 有状态接口简单实现 远程接口服务端和客户端,把服务端打包导入进客户端,需要JBOSS做容器
Java EJB简单例子,这是HelloWorldBean的Home接口,它是EJB对象的生成库,无状态会话(将在下一个实例中具体讲解)Bean,这个接口是客户端与EJB对象相互作用的中间途径,通过Client触发调用Bean方法: try { //...
Java EJB模型模拟完整代码,实现部分操作的远程接口和本地Home接口,还有各个模块功能的具体实现,是一个有利于学习的EJB模型实例。
EJB集群资料EJB集群资料EJB集群资料EJB集群资料
ejb-3_0-fr-spec-ejbcore.pdf ejb-3_0-fr-spec-persistence.pdf ejb-3_0-fr-spec-simplified.pdf
java反射与EJBjava反射与EJBjava反射与EJBjava反射与EJBjava反射与EJBjava反射与EJB
创建一个访问EJB的客户端应用程序,通过强制转型得到Home接口,同时还分享了一个函数,用于使用本地接口产生一个远程接口的应用。 其应用扩展展现的是一个简单的Stateless Session Bean的实现过程,希望能够对...
ejb3中文版
ejb+hibernate资料 ejb+hibernate资料 ejb+hibernate资料 ejb+hibernate资料
手动部署EJB 亲自体验EJB开发流程 手动部署EJB 亲自体验EJB开发流程
面向对象方法EJB组件面向对象方法EJB组件面向对象方法EJB组件面向对象方法EJB组件
EJB3.0规范 EJB3.0 SPECIFICATION 官方规范英文版
EJB基础学习EJB者必看里面详细记录了EJB技术等
Files contained in javax.ejb.jar: META-INF/MANIFEST.MF javax.ejb.AccessLocalException.class javax.ejb.AccessTimeout.class javax.ejb.ActivationConfigProperty.class javax.ejb.AfterBegin.class javax....
EJB3的三本好书之三,也很不错的一本ejb3的书籍,是英文版,附带源代码,这本书的好处是与Mastering EJB 3ed有一定的继承性,可以对比来看. 3本书的地址 1. Beginning EJB3 Application Development From Novice to ...
META-INF / maven / org.glassfish.main.ejb / javax.ejb / pom.properties META-INF / maven / org.glassfish.main.ejb / javax.ejb / pom.xml javax.ejb.AccessLocalException.class javax.ejb.AccessTimeout....