一個JNDI context lookup的問題,望高手不吝賜教!!!

vampire發表於2004-04-01
本人寫了這樣一個RMI-IIOP程式,為測試一下如下功能:
使用者輸入幾個IP地址,從這裡面查詢哪些Server端當前可用,哪些不可用。
//Server.java
import java.util.*;
import java.rmi.Remote;
import java.rmi.RemoteException;
import javax.rmi.PortableRemoteObject;
import javax.naming.Context;
import javax.naming.InitialContext;
public class Server extends PortableRemoteObject implements RMIInterface {
public Server() throws RemoteException {
}

// implementation of RMIInterface methods
public String showWelcome() throws RemoteException {
return "Welcome!!!";
}
public static void main(String[] args) {
try {
Hashtable env=new Hashtable();
env.put("java.naming.factory.initial","com.sun.jndi.cosnaming.CNCtxFactory");
env.put("java.naming.provider.url","iiop://localhost:1050");
Server s = new Server();
// create the naming context
Context initialNamingContext = new InitialContext(env);
initialNamingContext.rebind("Server", s );
System.out.println("Server waiting...");

} catch (Exception e) {
e.printStackTrace();
}
}





//Client.java
import javax.rmi.PortableRemoteObject;
import javax.naming.Context;
import javax.naming.InitialContext;
import java.util.*;
public class Client {
static Hashtable env[] = new Hashtable[4];
static int i=0;
public static void search(Hashtable env1){

try{
SerClass se = new SerClass(env1.toString());
// get the naming context
Context ic = new InitialContext(env1);

// get a reference to the remote object
Object objRef = ic.lookup("Server");
ic.close() ;
// narrow it into our RMIInterface
RMIInterface ri =
(RMIInterface) PortableRemoteObject.narrow(objRef, RMIInterface.class);

//invoke RMIInterface method
System.out.println("Recieved from server: " + ri.showWelcome() + "\n");
// display agent is valid or invalid
System.out.println("Valid Agent:" + se.getIp() + "\n");
}
catch (Exception e) {
System.out.println("invalid Agent");
}
finally{
if(i<3)
search(env[++i]);
}
}
public static void main(String[] args) {

for(int n=0;n<args.length ;n++){

env[n]=new Hashtable();
env[n].put("java.naming.factory.initial",
"com.sun.jndi.cosnaming.CNCtxFactory");
env[n].put("java.naming.provider.url", "iiop://" + args[n] + ":1050");
}
search(env[0]);

}
}
當前採用的方法是不管Server端開不開服務都嘗試連線一下,如果連上了就顯示valid agent;若產生異常則說明是invalid。
現在的問題是:在連線不可用的Server時要過比較長的時間才能顯示出invalid agent,不知是不是有設定lookup timeout的方法或者採取另一種更好的機制來實現查詢Server端可用性的方法。望高手不吝賜教!!!

相關文章