2012-05-23 8 views
14

Quiero saber una forma simple de implementar el mecanismo de devolución de llamada en Rserve para un cliente Java. De acuerdo con Rserve documentos:¿Cómo implementar el mecanismo de devolución de llamada en Rserve?

Rserve no proporciona funcionalidad de devolución de llamada. Su aplicación podría implementar devoluciones de llamada a través de TCP/IP y los sockets R pero no es parte de Rserve.

Esto significa que mi cliente java puede invocar funciones en la sesión remota a través de la referencia de Rconnection, pero la sesión remota no puede devolver la llamada al cliente java que lo ha instanciado. ¿Cómo puedo desarrollar tal mecanismo? Si está a través de sockets R o un servidor tcp/ip, ¿significa eso para cada conexión que habrá un servidor de socket abierto?

+2

puede usar 'socketConnection', de R, para conectarse a su cliente Java (que debería estar escuchando). –

+0

Hola, investigué un poco y sé cómo implementar llamadas no bloqueadas desde Java. No puedo implementarlo porque mi empresa no necesita eso, pero si alguien está interesado, póngame un mensaje. – Przemek

+0

Hola Prezmek, dejé de hacer esto a través de sockets, usé una cola de mensajes a la que el servidor R publicó y java escuchó para obtener la devolución de llamada. Si está interesado, puede utilizar www.inside- .org/packages/cran/Rjms/docs/Rjms para integrar con activeMQ – sanre6

Respuesta

1

Aquí está la respuesta que encontré en la http://statweb.stanford.edu/~lpekelis/13_datafest_cart/13_datafest_r_talk.pdf y al http://www.rforge.net/JRI/files/

de inicio con la instancia de R

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

Aquí está el código se puede ver por la llamada de vuelta:
enter image description here
Además, verifique los enlaces para mayor referencia. No entendí quién es el autor; de lo contrario, lo habría mencionado.

+1

Pruebe esto y espero que esto satisfaga su consulta .... ok –

+0

Creo que este 'rs.eval' bloqueará el hilo, por lo que no es la respuesta correcta – Przemek

2

Ok, así que esto es lo que pienso que es posible implementar reactiva R.

llamadas no bloqueantes de java

Es necesario que tenedor Rserve cliente Java y el método de división request en dos partes en este línea 1]. La primera parte escribe la solicitud en el socket y la segunda espera la respuesta. Necesitamos hacer que la espera sea opcional, por ejemplo, mediante el indicador boolean.

Volviendo resultado de R

necesitará algún tipo de comunicación activa a Java. Una posibilidad es usar sockets simples o algo en un nivel superior como HTTP. Pensé en el paquete httpRequest [2]. Así que la llamada de Java debe verse como:

connection.eval(s"""simplePostToHost(
"192.168.12.12","/listener/results/", 
try(eval(parse(text="$code")),silent=TRUE),port=8080""") 

escucha por un resultado en Java

La petición y la respuesta debe compartir algún tipo de identificación única por lo que sabemos, que es la respuesta para la cual la solicitud. Debe ejecutar algún servicio que escuche en path/listener/results para los resultados entrantes y le dice a Java que el resultado está listo. También debería permitir reutilizar RConnection que previamente debería marcarse como "ocupado". Recomiendo usar esta parte Scala Promise [T].

Espero que ayude a alguien. Probablemente voy a implementarlo una vez que mi empresa lo necesite.

[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

Cuestiones relacionadas