编写EJB客户端时取得那个Context对象是比较棘手的一个问题,对于不同的应用服务器,其工厂类和JNDI URL总是不同的,每次都得到处找资料,这次干脆一次性把所有资料都找了一下,写成一个类去获取InitialContext构造函数需要的那个Properties对象。查找的过程比我想象的艰难,这更坚定了我要将它们找出来的决心。目前已找出当今主流J2EE应用服务器的相关资料,有weblogic,websphere,jboss,sun one,oracle application server,JRun,IONA,对于Borland Enterprise Server(BES),大量资料表明它的客户端不需要为InitialContext构造函数提供参数,即Context ctx = new InitialContext()即可,对此我百思不得其解,Borland到底怎么实现获取其它机器上JNDI上下文的呢?所以我将BES对外隐藏了(private)。也许有我未知的东西,有知道的朋友请告知。另外,oracle application server有点特别,有些资料上没有写明它的JNDI端口,并且有时在其JNDI URL中会出现一个附加的Bean类名,这个服务器我没用过,也不知道原因,而JRun不需要提供JNDI服务的协议名,因此为了支持这些情况特地做了一些处理。 以下是这个ContextProperties类的代码:
import java.util.Properties; import javax.naming.InitialContext;
public class ContextProperties{ public static final int WEBLOGIC = 0; public static final int WEBSPHERE = 1; public static final int JBOSS = 2; public static final int SUNONE = 3; public static final int ORACLE = 4; public static final int JRUN = 5; public static final int IONA = 6; private static final int BES = 7; // public static final int NULL_PORT = Integer.MAX_VALUE; private static final String WEBLOGIC_FACTORY = "weblogic.jndi.WLInitialContextFactory"; private static final String WEBLOGIC_PROTOCOL = "t3"; private static final int WEBLOGIC_PORT = 7001; private static final String WEBSPHERE_FACTORY = "com.ibm.websphere.naming.WsnInitialContextFactory"; private static final String WEBSPHERE_PROTOCOL = "iiop"; private static final int WEBSPHERE_PORT = 2809; //may be 900 private static final String JBOSS_FACTORY = "org.jnp.interfaces.NamingContextFactory"; private static final String JBOSS_PROTOCOL = "jnp"; private static final int JBOSS_PORT = 1099; private static final String SUNONE_FACTORY = "com.sun.jndi.cosnaming.CNCtxFactory"; private static final String SUNONE_PROTOCOL = "iiop"; private static final int SUNONE_PORT = 3700; private static final String BES_FACTORY = ""; private static final String BES_PROTOCOL = ""; private static final int BES_PORT = NULL_PORT; private static final String ORACLE_FACTORY = "com.evermind.server.rmi.RMIInitialContextFactory"; private static final String ORACLE_PROTOCOL = "ormi"; private static final int ORACLE_PORT = 23791; //may be no private static final String JRUN_FACTORY = "jrun.naming.JRunContextFactory"; private static final String JRUN_PROTOCOL = ""; private static final int JRUN_PORT = 2908; private static final String IONA_FACTORY = "com.ejbhome.naming.spi.rmi.RMIInitCtxFactory"; private static final String IONA_PROTOCOL = "iiop"; private static final int IONA_PORT = 9070; private static final String DEFAULT_IP = "localhost";
private ContextProperties(){ }
public static Properties newInstance(int serverType, String ip, int port, String addIn){ String factory = null; String protocol = null; switch (serverType) { case WEBLOGIC : factory = WEBLOGIC_FACTORY; protocol = WEBLOGIC_PROTOCOL; break; case WEBSPHERE : factory = WEBSPHERE_FACTORY; protocol = WEBSPHERE_PROTOCOL; break; case JBOSS : factory = JBOSS_FACTORY; protocol = JBOSS_PROTOCOL; break; case SUNONE : factory = SUNONE_FACTORY; protocol = SUNONE_PROTOCOL; break; case ORACLE : factory = ORACLE_FACTORY; protocol = ORACLE_PROTOCOL; break; case JRUN : factory = JRUN_FACTORY; protocol = JRUN_PROTOCOL; break; case IONA : factory = IONA_FACTORY; protocol = IONA_PROTOCOL; break; case BES : factory = BES_FACTORY; protocol = BES_PROTOCOL; break; } Properties props = new Properties(); if (factory != null){ String slash = ""; if (protocol.length() > 0){ slash = "://"; } String portString = ""; if (port != NULL_PORT){ portString = ":" + port; } String additivePath = ""; if (addIn.length() > 0){ additivePath = "/" + addIn; } props.put(InitialContext.INITIAL_CONTEXT_FACTORY, factory); props.put(InitialContext.PROVIDER_URL, protocol + slash + ip + portString + additivePath); } return props; }
public static Properties newInstance(int serverType, String ip, int port){ return newInstance(serverType, ip, port, ""); }
public static Properties newInstance(int serverType, String ip){ int port = Integer.MIN_VALUE; switch (serverType) { case WEBLOGIC : port = WEBLOGIC_PORT; break; case WEBSPHERE : port = WEBSPHERE_PORT; break; case JBOSS : port = JBOSS_PORT; break; case SUNONE : port = SUNONE_PORT; break; case ORACLE : port = ORACLE_PORT; break; case JRUN : port = JRUN_PORT; break; case IONA : port = IONA_PORT; break; case BES : port = BES_PORT; break; } Properties props = new Properties(); if (port != Integer.MIN_VALUE){ props = newInstance(serverType, ip, port); } return props; }
public static Properties newInstance(int serverType){ return newInstance(serverType, DEFAULT_IP); }
} 
|