以下是实现RMI的片段
以下是我的服务器类
package com.queryExecutor.actionclass;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ExecutorServer extends UnicastRemoteObject implements executorInterface
{
public ExecutorServer()throws RemoteException
{
System.out.println("Server is in listening mode");
}
public void executeJob(String req_id,String usrname,String pwd,String driver,String url)throws RemoteException
{
System.out.println("Inside executeJob...");
acQueryExecutor a=new acQueryExecutor(req_id,usrname,pwd,driver,url);
ExecutorService threadExecutor = Executors.newCachedThreadPool();
threadExecutor.execute(a); // start task1
threadExecutor.shutdown(); // shutdown worker threads
}
public void killJob(String req_id)throws RemoteException{}
public int getJobStatus(String req_id)throws RemoteException{return 1;}
public void restart(String req_id)throws RemoteException{}
public static void main(String arg[])
{
try{
//Registry registry = LocateRegistry.getRegistry("10.155.1.159",1099);
LocateRegistry.createRegistry(2005);
ExecutorServer p=new ExecutorServer();
Naming.rebind("//127.0.0.1:2005/exec",p);
}catch(Exception e)
{
System.out.println("Exception occurred : "+e.getMessage());
}
}
@Override
public void executeJob(String req_id, String usrname, String pwd)
throws RemoteException {
// TODO Auto-generated method stub
System.out.println("Inside executeJob...");
acQueryExecutor a=new acQueryExecutor(req_id,usrname,pwd,"driver","url");
ExecutorService threadExecutor = Executors.newCachedThreadPool();
threadExecutor.execute(a); // start task1
threadExecutor.shutdown(); // shutdown worker threads
}
}
界面
package com.queryExecutor.actionclass;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface executorInterface extends Remote
{
public void executeJob(String req_id,String usrname,String pwd)throws RemoteException;
public void killJob(String req_id)throws RemoteException;
public int getJobStatus(String req_id)throws RemoteException;
public void restart(String req_id)throws RemoteException;
}
package com.queryExecutor.actionclass;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface executorInterface extends Remote
{
public void executeJob(String req_id,String usrname,String pwd)throws RemoteException;
public void killJob(String req_id)throws RemoteException;
public int getJobStatus(String req_id)throws RemoteException;
public void restart(String req_id)throws RemoteException;
}
客户
package com.queryExecutor.actionclass;
import java.rmi.Naming;
public class testClient {
public static void main(String args[])
{
try{
executorInterface p=(executorInterface)Naming.lookup("//127.0.0.1:2005/exec");
p.executeJob("1", "abc", "abc");
}
catch(Exception e)
{
System.out.println("Exception occurred : "+e.getMessage());
}
}
}
当我运行客户端代码时,我没有在eclipse控制台头中获得任何输出它的javaw.exe被写入终止。 我的问题是为什么我的客户端程序没有命中服务器。
答案 0 :(得分:0)
您需要将LocateRegistry.createRegistry()
的结果存储在不会被垃圾收集的地方。否则 将被垃圾收集=>没有注册表=> Naming.lookup()
失败=>客户端的静默退出,因为您通过将异常打印到没有这样的事情的javaw.exe进程的System.out来处理异常。
调用Naming.bind()
或Naming.rebind()
时,使用“localhost”以外的任何主机名都没有多大意义。如果主机名不是本地的,那么无论如何它都会失败,所以你只是在te服务器代码中添加一个额外的无意义配置噩梦。将它设为'localhost',它将在任何地方运行。
您的executeJob()
方法完全是疯狂的。它创建一个Executor,调度一个作业,然后关闭Executor:所以Executor永远不能进行线程池化;所以这基本上是浪费时间。你也可以生成一个Thread来执行任务;但是,由于RMI已经是多线程的,您可以自己执行任务。失去这一切。