Итак, вот как я думаю, можно реализовать реактивный R.
Неблокирующие вызовы из java
Вам нужно разветвить java-клиент RServe и разделить метод request
на две части в этой строке [1]. Первая часть записывает запрос в сокет, а вторая ждет ответа. Нам нужно сделать ожидание необязательным, например, с помощью флага 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
Запрос и ответ должны иметь какой-то уникальный идентификатор, чтобы мы знали, какой ответ для какого запроса. Вы должны запустить какую-то службу, которая прослушивает путь /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
person
Przemek
schedule
16.07.2015
socketConnection
из R для подключения к вашему Java-клиенту (который должен слушать). - person Vincent Zoonekynd   schedule 23.05.2012