提问人:nicolasCDT 提问时间:10/11/2023 更新时间:10/15/2023 访问量:56
使用 JAVA RMI 进行回调
Make a callback with JAVA RMI
问:
我目前正在使用 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;
}
答:
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 不是很满意......
评论
RemoteException