Как реализовать механизм обратного вызова в Rserve?

Я хочу знать простой способ реализации механизма обратного вызова в Rserve для java-клиента. Согласно Rserve docs:

Rserve не предоставляет функции обратного вызова. Ваше приложение может реализовать обратные вызовы через TCP/IP и R-сокеты, но это не является частью Rserve.

Это означает, что мой java-клиент может вызывать функции на удаленном сеансе через ссылку Rconnection, но удаленный сеанс не может перезвонить клиенту java, который его создал. Как я могу разработать такой механизм. Если его сквозные сокеты R или сервер tcp/ip, это означает, что для каждого соединения будет открыт сервер сокетов?

Ответы

Ответ 1

Хорошо, так я думаю, что можно реализовать реактивный R.

Неблокирующие вызовы из java

Вам нужно развить RSWA java-клиент и разделить метод 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

Запрос и ответ должны предоставлять уникальный идентификатор, чтобы мы знали, какой ответ для какого запроса. Вы должны запустить некоторую службу, которая прослушивает путь/слушатель/результаты для входящих результатов и сообщает 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

Ответ 2

Вот ответ, который я нашел на http://statweb.stanford.edu/~lpekelis/13_datafest_cart/13_datafest_r_talk.pdf и на http://www.rforge.net/JRI/files/

Начните с экземпляра R

Rengine re= new Rengine(args, false, new TextConsole());

Вот код, который вы можете увидеть для обратного вызова:
enter image description here
Кроме того, проверьте ссылки для дальнейшего использования. Я не получил, кто автор, иначе я бы упомянул об этом.