编写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);
}
}