我目前正在使用 Java RMI 实现一种任务包。目标是“客户端”将“任务”对象提交到“服务器”,另一方面,我有“工作人员”来拾取任务来执行它们。
但是,我想实现一个回调,以便工作人员可以将结果发送回客户端(如果需要通过服务器,那也是可能的)。不过,我不确定如何实现这一目标。 我应该提到的是,工作人员执行的任务可能需要几个小时,所以我希望结果最终能到达客户。
我尝试向发送到服务器的“Task”对象添加一个TaksCallBack对象(这是一个FunctionalInterface)并传递匿名函数,但它告诉我这些是不可序列化的。
我不一定要这样进行;我正在寻找一种方法来做到这一点。我对JAVA不太熟悉,要求用JAVA RMI来做。
现在,我只是想了解一切是如何工作的,所以我的任务对象相对简单:
public Task(int taskId, String query, TaskCallback callback) {
this.taskId = taskId;
this.query = query;
this.callback = callback;
}
解决方案: 你必须共享这样的界面:
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(...);