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

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

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

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


person sanre6    schedule 23.05.2012    source источник
comment
Вы можете использовать socketConnection из R для подключения к вашему Java-клиенту (который должен слушать).   -  person Vincent Zoonekynd    schedule 23.05.2012
comment
Привет, я провел небольшое исследование и знаю, как реализовать неблокирующие вызовы из java. Не могу реализовать, потому что моей компании это не нужно, но если кому-то интересно, пингуйте меня.   -  person Przemek    schedule 16.07.2015
comment
Привет, Презмек, я отказался от этого через сокеты, использовал очередь сообщений, которую публиковал R-сервер, и java прослушивал, чтобы получить обратный вызов. Если интересно, вы можете использовать www.inside-r.org/packages/cran/Rjms/docs/Rjms для интеграции с activeMQ.   -  person sanre6    schedule 16.07.2015


Ответы (2)


Итак, вот как я думаю, можно реализовать реактивный 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

Вот ответ, который я нашел на 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());

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

person Jaffer Wilson    schedule 16.07.2015
comment
Я думаю, что этот rs.eval заблокирует ветку, так что это неправильный ответ. - person Przemek; 16.07.2015