数据库对象无法使用正常工作的RMI包

时间:2014-02-03 11:22:22

标签: java rmi

我有2个项目。一个人在任何部门工作都很好。我下载并修改它以更好地理解它。第二个是处于开发阶段的项目。

现在,这两个项目都有几乎完全相同的RMI包,它在第一个项目中运行良好,但在第二个项目中没有。

我在每个包中的测试类基本相同。

主要区别在于尝试访问的对象,它们都是数据库包中的接口。

现在,第二个项目中的数据库包在其他方面工作得非常好,它只是不适用于RMI。

简而言之:

  • 数据库包工作正常
  • RMI包工作正常
  • RMI包和数据库一起工作不正常。

这是我的DBInterface

public interface DB extends Remote {

public String[] read(int recNo) throws RecordNotFoundException;

public void update(int recNo, String[] data, long lockCookie)
throws RecordNotFoundException, SecurityException, IOException;

public void delete(int recNo, long lockCookie)
throws RecordNotFoundException, SecurityException, IOException;

public int[] find(String[] criteria);

public int create(String[] data) throws DuplicateKeyException, IOException;

public long lock(int recNo) throws RecordNotFoundException;

public void unlock(int recNo, long cookie)
throws RecordNotFoundException, SecurityException;
}

这是我的RMIInterface

public interface RMIInterface extends Remote{

     public DB getClient() throws RemoteException; 
}

我的RMIImplementation

public class RMIImplementation extends UnicastRemoteObject
    implements RMIInterface {  

private static String dbLocation = null;

private DB a;

public RMIImplementation() throws RemoteException{
}

public RMIImplementation(String dbLocation) throws RemoteException{
    System.out.println(dbLocation);
    this.dbLocation = dbLocation;
}

public static DB getRemote(String hostname, String port)
        throws RemoteException {
    String url = "rmi://" + hostname + ":" + port + "/DvdMediator";
    try {
        RMIInterface factory
                = (RMIInterface) Naming.lookup(url);
         // at this point factory equals Proxy[RMIInterface,................etc
        // i want the return to equal Proxy[DB,..............etc
return (DB) factory.getClient(); 
    } catch (NotBoundException e) {

        throw new RemoteException("Dvd Mediator not registered: ", e);
        }

      catch (java.net.MalformedURLException e) {
        throw new RemoteException("cannot connect to " + hostname, e);
    }
}

public DB getClient() throws RemoteException {
      try {
    a = new ContractorDatabase(dbLocation);

    }
    catch(Exception e){
        System.out.println("NewClass exception: " + e.toString());
    }
    return a;
}

我的RMI注册表

public class RegDvdDatabase {

private RegDvdDatabase() {
}

public static void register()
        throws RemoteException {
    register(".", java.rmi.registry.Registry.REGISTRY_PORT);
}

public static void register(String dbLocation, int rmiPort)
        throws RemoteException {

    Registry r = java.rmi.registry.LocateRegistry.createRegistry(rmiPort);

    r.rebind("DvdMediator", new RMIImplementation(dbLocation));
}

}

让这两个一起工作会抛出一个

Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy0 cannot be     cast to sjdproject.remote.RMIImplementation

请你帮我找一个阻止它工作的数据库问题。

2 个答案:

答案 0 :(得分:0)

您必须将其投射到远程接口。

编辑服务器代码中的注册表引用r必须是静态的。我看不出在实现类中查找客户端查找代码的任何充分理由。该类应该只存在于服务器上,而不是客户端。

答案 1 :(得分:-1)

如果您没有调试器,我建议在提供的对象上使用反射并查看它实现的接口。它似乎是一个代理对象,因此必须实现一些接口。

 for(Class clazz : factory.getClass().getInterfaces()) {
   System.out.println(clazz.getSimpleName());
 }

我对多个部署的怀疑当然是jvm版本和类路径。你能证实它们匹配吗?