簡體   English   中英

Java RMI-如何從客戶端發送對象以進行回調

[英]Java RMI - how to send an object for callback from client

我正在使用RMI,我有Server Client程序。

客戶端從服務器訪問某些方法。

但是,在一種方法中,我想傳遞一個客戶端本地對象,使用該對象的引用服務器將執行回調(該回調將在客戶端上執行),至少這是我想要的,但可能是我做錯了。

在客戶處

---------------------------------------------------------------------------------
   server.setLock("/hello.txt", 99, 125,Locker.Lock_type.WRITE,"Shubham Verma",true, new CallBackProcess());
---------------------------------------------------------------------------------   

CallBackProcess implements an interface which is presented on both the ends. 

But I get this error    

Exception in thread "main" java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: scality.CallBackProcess (no security manager: RMI class loader disabled)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:353)
    at sun.rmi.transport.Transport$1.run(Transport.java:177)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:701)
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:273)
    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:251)
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:160)
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194)
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148)
    at com.sun.proxy.$Proxy1.setLock(Unknown Source)
    at scality.Client.main(Client.java:31)
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: scality.CallBackProcess (no security manager: RMI class loader disabled)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:313)
    at sun.rmi.transport.Transport$1.run(Transport.java:177)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:701)
Caused by: java.lang.ClassNotFoundException: scality.CallBackProcess (no security manager: RMI class loader disabled)
    at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:393)
    at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:183)
    at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:637)
    at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:264)
    at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:220)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1611)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1516)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1770)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1349)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
    at sun.rmi.server.UnicastRef.unmarshalValue(UnicastRef.java:324)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:307)
    ... 9 more

public interface Callback extends Remote{
    void execute() throws RemoteException;
}


public class CallBackProcess implements Callback, Serializable{
    public static int test = 0;
    @Override
    public void execute() {
        // need to do something here
    }
}

基本上,它試圖告訴您它無法訪問遠程代碼。 它試圖反序列化一個沒有定義的類。 客戶端從“代碼庫”中加載類。 它們不是由客戶端通過RMI連接加載的,因此它們無法序列化對此一無所知的此類。

在命令行上啟動JVM時,服務器應指定系統屬性“ java.rmi.server.codebase”,或在嘗試運行RMI客戶端之前在代碼中設置它。 該值必須是客戶端可訪問的URL,並且應指向要加載的必要類。 通常,我使用“ file://”協議處理程序指定一個.jar文件。

反之亦然:如果客戶端返回類,則服務器必須反序列化,服務器必須將代碼庫屬性設置為包含返回的類的服務器可訪問的URL。 通常最好讓您的DAO對象及其接口使用.jar,並由客戶端和服務器共享,以免混淆哪些類需要存放在哪里。

您尚未導出回調對象,因此將其序列化而不是作為遠程引用傳遞,並且對等方沒有實現類,因此它會收到此錯誤。 使它擴展UnicastRemoteObject。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM