14

我想知道在 Rserve 中为 java 客户端实现回调机制的简单方法。根据Rserve文档:

Rserve 不提供回调功能。您的应用程序可以通过 TCP/IP 和 R 套接字实现回调,但它不是 Rserve 的一部分。

这意味着我的 java 客户端可以通过 Rconnection 引用调用远程 Session 上的函数,但远程 Session 不能回调已实例化它的 java 客户端。我怎样才能开发出这样的机制。如果它通过 R 套接字或 tcp/ip 服务器,这是否意味着每个连接都会打开一个套接字服务器?

4

2 回答 2

2

好的,这就是我认为可以实现反应式 R 的方式。

来自java的非阻塞调用

request您需要在这一行 [1]中将 RServe java 客户端和 split 方法分成两部分。第一部分向套接字写入请求,第二部分等待响应。我们需要通过例如一些boolean标志使等待成为可选。

从 R 返回结果

您将需要某种与 Java 的主动通信。一种可能性是使用普通套接字或更高级别的东西作为 HTTP。我想到了 httpRequest 包 [2]。所以来自 java 的调用应该是这样的:

connection.eval(s"""simplePostToHost(
"192.168.12.12","/listener/results/",
try(eval(parse(text="$code")),silent=TRUE),port=8080""")

在 Java 中侦听结果

请求和响应应该共享某种唯一 ID,以便我们知道哪个响应是针对哪个请求的。您应该运行一些服务,在路径 /listener/results 上侦听传入结果并告诉 Java 结果已准备好。它还应该能够重用以前应该标记为“忙碌”的 RConnection。我建议在这部分 scala Promise[T] 中使用它。

希望它可以帮助某人。一旦我的公司需要它,我可能会实施它。

[1] https://github.com/su/REngine/blob/a74e184c051c2d2e850430cd2d0526656d3a6c48/Rserve/protocol/RTalk.java#L211

[2] https://cran.r-project.org/web/packages/httpRequest/httpRequest.pdf

于 2015-07-16T13:49:55.520 回答
1

这是我在http://statweb.stanford.edu/~lpekelis/13_datafest_cart/13_datafest_r_talk.pdfhttp://www.rforge.net/JRI/files/上找到的答案

从 R 的实例开始

Rengine re= new Rengine(args, false, new TextConsole());

这是您可以看到的回调代码:
在此处输入图像描述
此外,请查看链接以获取更多参考。我不知道作者是谁,否则我会提到它。

于 2015-07-16T10:32:01.860 回答