如何在EJB3中JNDI调用SessionBean(二)中,我们初步解决了分布式调用EJB组件的问题,但是问题又出现了,我们在这里不得不对我们尊敬的SUN一口恶骂,为什么不统一标准,让所有的EJB容器都采用同样格式的JNDI获取方式。现在问题来了,不同的容器存在自己特有的lookup实现方式,太郁闷了,这样就要将EJB组件和容器绑死了,这为以后EJB组件的移植设置了巨大的障碍。我们思考着,这个问题似曾相识,对,用工厂模式来解决这种移植性的问题,对不同的实现通过工厂的方式进行集中管理,从而方便系统的移植。说干就干,我们建立一个公共的接口:
 

Java代码
  1. public interface JNDIFinder {   
  2.    public Object lookup(InitialContext ctx, Class clazz)
  3.                                       throws NamingException;   
  4. }  


我们为每个容器建立自己的JNDI查找实现类:JbossJNDIFinderImpl.java,WeblogicJNDIFinderImpl.java

然后再建立JNDIFinder的工厂来进行管理和获取:JNDIFactory.java
 

Java代码
  1. public static JNDIFinder getFinder(String server) {   
  2.     if (JBOSS_SERVER.equals(server)) {   
  3.      return new JbossJNDIFinderImpl();   
  4.     } else if (WEBLOGIC_SERVER.equals(server)) {   
  5.      return new WeblogicJNDIFinderImpl();   
  6.     }   
  7.     return new JbossJNDIFinderImpl();// 默认返回jboss的实现   
  8. }  


而getFinder(String server)中的server我们可以将它配置到我们的JNDI配置文件中:
server=jboss
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jpn.interfaces
java.naming.provider.url=jnp://localhost:1099
万事俱备只欠东风了,我们最后把这些要统一封装成一个最简单方法来进行调用。我们建立一个工具类JNDIUtil.java,在该类中,我们向外暴露一个静态方法:
public static Object lookup(Class clazz) throws NamingException

大功告成了,现在只需要一个简单的调用Login login =(Login)JNDIUtil.lookup(Login.class); 就解决了上面提出的相关问题,实现了跨EJB服务器的分布式EJB组件的调用。(后面将附上该方案的相关源代码)
当然,这个解决方案还需要经过实际开发的检验,我们也将不断地优化该方案,也希望更多人讨论交流,提出宝贵的意见,目的是为了更好的解决该问题。
在这里贡献出源码,希望大家多多支持我的博客,谢谢大家!
我的官方博客源码链接:http://www.po-soft.com/blog/yongtree/207.html

posted on 2009-07-20 10:45  LanrenXuan  阅读(1398)  评论(0编辑  收藏  举报