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

时间:2012-05-23 07:12:21

标签: r sockets rserve

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

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

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

2 个答案:

答案 0 :(得分:2)

好的,这就是我认为实施反应性R的方法。

来自java

的非阻塞调用

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

返回结果

您需要与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,以便我们知道哪个响应针对哪个请求。您应该运行一些服务来侦听传入结果的路径/侦听器/结果,并告诉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 :(得分: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());

以下是您可以看到的回拨代码:
enter image description here
另外,请检查链接以获取进一步参考。我没有得到谁是作者,否则我会提到它。