在如何在EJB3中JNDI调用SessionBean(二)中,我们初步解决了分布式调用EJB组件的问题,但是问题又出现了,我们在这里不得不对我们尊敬的SUN一口恶骂,为什么不统一标准,让所有的EJB容器都采用同样格式的JNDI获取方式。现在问题来了,不同的容器存在自己特有的lookup实现方式,太郁闷了,这样就要将EJB组件和容器绑死了,这为以后EJB组件的移植设置了巨大的障碍。我们思考着,这个问题似曾相识,对,用工厂模式来解决这种移植性的问题,对不同的实现通过工厂的方式进行集中管理,从而方便系统的移植。说干就干,我们建立一个公共的接口:
- public interface JNDIFinder {
- public Object lookup(InitialContext ctx, Class clazz)
- throws NamingException;
- }
我们为每个容器建立自己的JNDI查找实现类:JbossJNDIFinderImpl.java,WeblogicJNDIFinderImpl.java
然后再建立JNDIFinder的工厂来进行管理和获取:JNDIFactory.java
- public static JNDIFinder getFinder(String server) {
- if (JBOSS_SERVER.equals(server)) {
- return new JbossJNDIFinderImpl();
- } else if (WEBLOGIC_SERVER.equals(server)) {
- return new WeblogicJNDIFinderImpl();
- }
- return new JbossJNDIFinderImpl();// 默认返回jboss的实现
- }
而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