我想知道在Rserve中为Java客户端实现回调机制的简单方法。根据Rserve文档:
Rserve不提供回调功能。您的应用程序可以通过TCP/IP和R sockets实现回调,但这不是Rserve的一部分。
这意味着我的Java客户端可以通过Rconnection引用调用远程会话上的函数,但远程会话不能回调实例化它的Java客户端。我该如何开发这样的机制?如果是通过R sockets或tcp/ip服务器,这是否意味着每个连接都会打开一个套接字服务器?
好的,这是我认为可以实现反应式R的方法。
您需要分叉RServe Java客户端并在此行[1]中将request
方法拆分为两个部分。第一部分将请求写入套接字,第二部分等待响应。我们需要通过一些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""")
请求和响应应该共享某种唯一ID,以便我们知道哪个响应是哪个请求的。您应该运行一些服务,监听路径/ listener / results以获取传入结果,并告诉Java结果已准备就绪。它还应该能够重用先前标记为“繁忙”的RConnection。 我建议在此部分使用scala Promise[T]。
希望对某人有所帮助。如果我的公司需要,我可能会实现它。
[2]https://cran.r-project.org/web/packages/httpRequest/httpRequest.pdf
Rengine re= new Rengine(args, false, new TextConsole());
rs.eval
会阻塞线程,所以它不是正确的答案。 - Przemek
socketConnection
来连接到正在侦听的 Java 客户端。 - Vincent Zoonekynd