如何在Rserve中实现回调机制?

14

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

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

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


2
您可以使用 R 中的 socketConnection 来连接到正在侦听的 Java 客户端。 - Vincent Zoonekynd
嗨,我做了一些研究,知道如何从Java实现非阻塞调用。但是因为我的公司不需要,所以无法实现。但如果有人感兴趣,请联系我。 - Przemek
嗨Prezmek,我放弃使用套接字来完成这个任务,而是使用了消息队列。R服务器发布消息,Java监听并获取回调。如果您有兴趣,可以使用www.inside-r.org/packages/cran/Rjms/docs/Rjms与activeMQ集成。 - sanre6
2个回答

2

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

从Java进行非阻塞调用

您需要分叉RServe Java客户端并在此行[1]中将request方法拆分为两个部分。第一部分将请求写入套接字,第二部分等待响应。我们需要通过一些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/s-u/REngine/blob/a74e184c051c2d2e850430cd2d0526656d3a6c48/Rserve/protocol/RTalk.java#L211

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


1

我认为这个 rs.eval 会阻塞线程,所以它不是正确的答案。 - Przemek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接