使用JAVA RMI进行回调

问题描述 投票:0回答:1

我目前正在使用 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;
}
java callback rmi functional-interface
1个回答
0
投票

解决方案: 你必须共享这样的界面:

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(...);
© www.soinside.com 2019 - 2024. All rights reserved.