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);
}
分享到:
相关推荐
EJB2.0引入了本地接口的概念,允许开发者使用本地接口访问EJB组件,提高性能。在这一部分,我们将学习如何使用本地接口实现CMP实体Bean。 **开发EJB2.0的CMP (EJBQL)** EJBQL (Enterprise JavaBeans Query ...
1. **Home Interface**(家接口):这是客户端用来创建和管理EJB实例的接口。它提供了查找、创建和移除EJB实例的方法。例如,`create()`方法用于实例化EJB,而`remove()`方法则用于销毁实例。 2. **Remote ...
这个"Java EJB模型模拟完整代码.rar"压缩包提供了一个学习EJB模型的实例,它包含了一系列实现特定操作的远程接口、本地Home接口以及各个模块的功能代码。 EJB的核心概念主要包括三个主要组件:Entity Beans(实体...
- **生成的Proxy对象**:PowerBuilder会生成两个Proxy对象,即`mailserver`和`mailserverhome`,分别对应远程接口和Home接口。其中,Home接口提供了create()函数,供客户端调用来获取远程接口实例。 #### 3. 声明...
标题“JNDI调用分布式EJB3 通用接口”意味着我们将探讨如何使用JNDI来查找和调用分布在不同节点上的EJB3组件。EJB3中的一个重要特性是它可以跨网络进行分布,这使得应用程序能够利用多台服务器的资源,提高可伸缩性...
- **EJB 2.0**:需要为每个实体Bean定义一个Home接口,用于创建和查找Bean实例。 - **EJB 3.0**:取消了Home接口的需求,简化了实体Bean的创建和查找过程。 #### 五、其他变化 - **EJB 3.0**:提供了轻量级的支持,...
项目中用到的定时调用Ejb接口示例。在jboss下通过。需要依赖jbossall-client.jar包
EJB2中的对象创建过程通常涉及JNDI查找和工厂方法(如home.create())。EJB3则引入了依赖注入(Dependency Injection,DI)的概念,使用@EJB注解实现对象的自动装配,使得代码更加简洁和松耦合。比如: ```java @...
在这一模式下,客户端首先通过JNDI(Java Naming and Directory Interface)查找EJB的Home接口,JNDI允许将分布式对象与逻辑名称绑定,使得客户端能通过名称找到EJB。然后,客户端使用Home接口创建远程接口实例,...
<home>元素用于描述EJB组件的Home接口信息,该元素包含了多个子元素,如等。 元素用于描述EJB组件的远程接口信息,该元素包含了多个子元素,如<EJB-CLASS>等。 <EJB-CLASS>元素用于描述EJB组件的实现类信息,例如...
Home接口是用来创建和查找EJB Object 接口; 组件接口是不同类型的EJB要求实现的指定的接口; 比如: 会话Bean, 实现SessionBean, 导致 Bean类依赖容器; 2) 可以使用注释来代替配置文件; 3) 简化访问EJB容器...
在给定的【部分内容】中,首先介绍了实现EJB组件的一般过程,包括编写业务逻辑Bean类、定义远程接口和home接口以及编写ejb-jar.xml部署描述文件。然后,将这些组件和描述文件打包成一个ejb-jar文件,并使用服务器...
在本文中,我们将深入探讨如何在WebLogic环境中部署EJB 2.0,特别是实现本地接口的Session Bean。 EJB 2.0是Java EE早期版本中的组件模型,用于构建可复用、分布式的企业级服务。它定义了三种主要类型的Bean:...
首先,需要安装EJB容器如Apusic Application Server,接着定义远程接口和Home接口,编写EJB类,创建部署描述符`ejb-jar.xml`,最后编译、部署并编写客户端调用程序。 通过上述过程,我们可以看到EJB为开发者提供了...
1. **EJB客户端接口**:了解EJB客户端如何与远程服务器上的EJB组件进行交互,包括定义Home接口和Remote接口,以及调用EJB方法的步骤。 2. **JNDI查找**:学习如何通过Java Naming and Directory Interface (JNDI) ...
- WebLogic Server提供多种性能优化选项,如缓存管理、JVM调优、连接池配置等,以提高EJB应用的性能。 11. **EJB 3.1和以上版本的新特性** - 自动化的注解驱动编程降低了EJB的复杂性,如@Stateless、@Stateful、@...
理论上任何Java类都可能被视为一个Bean,但在实践中,JavaBean通常具备无参数构造函数,并实现了`Serializable`接口以支持持久化。JavaBean类似于COM模型中的本地进程内组件,不具备跨进程访问能力。 - **...
对于实体bean,可能有home接口(Home Interface)和远程接口。 4. **部署描述符**(Deployment Descriptor):这是XML文件,包含了EJB组件的配置信息,如组件的名称、接口、安全设置等。在EJB 3.0及以上版本,可以...
- EJB的remote home接口类应继承自`weblogic.wtc.jatmi.TuxedoServiceHome`,这是创建和查找EJB实例的入口。 - EJB的bean类中至少有一个方法暴露为服务,例如上面代码中的`service`方法。这个方法会接收Tuxedo传递的...