2017-01-26 12 views
0

Ich versuche, eine RServe-Sitzung von Java zu trennen und anschließend anzuhängen. Die Verbindung zu RServe funktioniert einwandfrei, aber das Anhängen verursacht eine Ausnahme. Trennen und Anfügen von RServe-Verbindung: Verbindung nicht möglich

package com.company.korana.r_interface; 

import org.rosuda.REngine.Rserve.RConnection; 

import com.company.korana.config.Config$;; 

public class RToast { 
    public static void main(String[] args) throws Exception { 
     RConnection rConnection = new RConnection(Config$.MODULE$.rserveHost(), Config$.MODULE$.rservePort()); 

     rConnection.assign("testVariable", "hello from java"); 
     rConnection.eval("print('Hi R console from java')"); // <--- this is visible in the R console 

     org.rosuda.REngine.Rserve.RSession sessionHandle = rConnection.detach(); 

     rConnection = sessionHandle.attach(); // <---- this throws 

     System.out.println(rConnection.eval("testVariable").asString()); 
    } 
} 

Exception in thread "main" org.rosuda.REngine.Rserve.RserveException: Verbindung nicht möglich: Connection refused: connect bei org.rosuda.REngine.Rserve.RConnection (RConnection.java.: 90) um org.rosuda.REngine.Rserve.RConnection. (RConnection.java:66) um org.rosuda.REngine.Rserve.RSession.attach (RSession.java:36) um com.company.korana.r_interface .RToast.main (RToast.java:16) Verursacht von: java.net.ConnectException: Verbindung abgelehnt: connect unter java.net.DualStackPlainSocketImpl.connect0 (Native Method) unter java.net.DualStackPlainSocketImpl.socketConnect (Unknown Source) bei java.net.AbstractPlainSocketImpl.doConnect (Unknown Source) bei java.net.AbstractPlainSocketImpl.connectToAddress (Unknown Source) bei java.net.AbstractPlainSocketImpl.connect (Unknown Source) um java.net.PlainSocketImpl.connect (Unbekannte Quelle) um java.net.SocksSocketImpl.connect (unbekannte Quelle) um java.net.Socket.connect (unbekannte Quelle) um java.net.Socket.connect (Unbekannte Quelle) um java.net.Socket. (Unbekannte Quelle) um java.net.Socket. (Unbekannte Quelle) um org.rosuda.REngine.Rserve.RConnection. (RConnection.java:85) ... 3 mehr

Der Rserve läuft auf localhost mit dem Standardport.

EDIT: ich folgendes Maven Artefakt bin mit:

<dependency> 
    <groupId>org.rosuda.REngine</groupId> 
    <artifactId>Rserve</artifactId> 
    <version>1.8.1</version> 
</dependency> 

Antwort

0

Nach der Überprüfung der Quellen, es stellt sich heraus, dass rserve Sitzungen, wenn freistehend, auf einem zufällig zugeordneten Port hören.

Rserv.c, Linie 1781

while ((port = (((int) random()) & 0x7fff)+32768)>65000) {}; 

So ist der Port, der zwischen dem Client und rserve erreichbar sein muss, ist etwas zwischen 32768 und 65000. In meinem Fall das funktionierte nicht weil ich Docker benutzt habe.

EDIT: Ich habe eine Lösung für die Verwendung von Rserve mit Docker ohne eine große Auswahl an Ports (die nicht gut mit Docker funktioniert) erstellt. Die snipper unten ersetzt meine install.packages ("rserve"):

RUN wget https://www.rforge.net/src/contrib/Rserve_1.8-5.tar.gz 
RUN tar -xf Rserve_1.8-5.tar.gz 
RUN rm Rserve_1.8-5.tar.gz 
RUN sed -i '1763s/.*/\t\tint port = 53000;/' /Rserve/src/Rserv.c 
RUN sed -i '1781s/.*//' /Rserve/src/Rserv.c 
RUN sed -i '1793s/.*/\t\tif (port>53100) {/' /Rserve/src/Rserv.c 
RUN tar -czvf Rserve_1.8-5.tar.gz /Rserve 
RUN R CMD INSTALL Rserve_1.8-5.tar.gz 

Dies ändert die rserve Quellen, damit die Häfen im Bereich getroffen werden [53000, 53100 [was in meinem Fall ausreichend ist.

Verwandte Themen