好的,这就是我认为可以实现反应式 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