使用 JAVA RMI 进行回调

Make a callback with JAVA RMI

提问人:nicolasCDT 提问时间:10/11/2023 更新时间:10/15/2023 访问量:56

问:

我目前正在使用 Java RMI 实现一种任务包。目标是让“客户端”将“任务”对象提交到“服务器”,另一方面,我有“工作线程”来获取任务来执行它们。

但是,我想实现一个回调,以便 Workers 可以将结果发送回客户端(如果需要通过服务器,这也是可能的)。不过,我不确定如何实现这一目标。 我应该提一下,工人执行的任务可能需要几个小时,所以我希望结果最终到达客户手中。

我试图将一个 TaksCallBack 对象(一个 FunctionalInterface)添加到发送到服务器的“Task”对象并传递匿名函数,但它告诉我这些是不可序列化的。

我不一定想这样进行;我正在寻找一种方法来做到这一点。我对 JAVA 不是很熟悉,我需要用 JAVA RMI 来完成。

现在,我只是想了解一切是如何工作的,所以我的 Task 对象相对简单:

public Task(int taskId, String query, TaskCallback callback) {
    this.taskId = taskId;
    this.query = query;
    this.callback = callback;
}
java 回调 rmi 函数接口

评论

0赞 user207421 10/12/2023
你传递的函数对象需要导出远程对象,它们的方法需要在远程接口中定义,这意味着它们必须全部抛出,这反过来意味着它们不能是函数接口。RemoteException

答:

0赞 nicolasCDT 10/15/2023 #1

溶液: 你必须共享一个这样的界面:

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface CallbackInterface extends Remote {

    void handler(String string) throws RemoteException;
}

发件人必须使用如下类:

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

@FunctionalInterface
interface LambdaFunction {
    void handler(String string);
}

public class Callback extends UnicastRemoteObject implements CallbackInterface {
    LambdaFunction function;

    public Callback(LambdaFunction function) throws RemoteException {
        this.function = function;
    }

    public void handler(String result) {
        this.function.handler(result);
    }
}

您可以将它与:

// Sender : 
server.submitTask(task, new Callback(Client::method));
// Receiver : 
callback.handler(...);

评论

0赞 user207421 10/15/2023
你试过了吗?为什么选择lambda?它有效吗?
0赞 nicolasCDT 10/16/2023
似乎 lambda 函数是不可序列化的。我不能保证任何事情,我对 JAVA 不是很满意......