连接多个连接时Rserve挂起

时间:2018-08-14 16:53:17

标签: java r rserve

我启动Rserve:

C:\Program Files\R\R-3.5.0\bin\x64> "C:\Users\XXXX\DOCUME~1\R\WIN-LI~1\3.5\Rserve\libs\x64\Rserve.exe" --RS-port 1000

运行以下Java代码:

import org.rosuda.REngine.REXPMismatchException;
import org.rosuda.REngine.Rserve.RConnection;
import org.rosuda.REngine.Rserve.RserveException;

public class TestR {
    private  RConnection con;
    private  RConnection con2;
    public TestR(){
        try {
            con = new RConnection();
            con2 = new RConnection();
        } catch (RserveException e) {
            e.printStackTrace();
        }
    }
    public Double test(){
        try {

            double d = con.eval("1+1").asDouble();
            double c = con2.eval("1+1").asDouble();
            return d+c;
        } catch (RserveException | REXPMismatchException e) {
            return (double)(-1);
        }
    }
}

我在JUnit上创建了以下类对其进行测试:

import org.junit.Test;

import static org.junit.Assert.*;

public class TestRTest {

    @Test
    public void test(){
        TestR t = new TestR();
        t.test();
    }

}

运行此测试时,它在使连接不稳定的同时停止,它创建了第一个,但在第二个上却挂起。知道为什么会这样吗?

First, no connections established

Second, one connection established

Hangs on second connection

挂起

1 个答案:

答案 0 :(得分:0)

您的问题可能与多线程问题有关。

Unix:没问题,一个Rserve实例可以处理多个调用。

Windows:Rserve无法通过分叉当前进程来创建单独的进程。 ->为每个线程创建一个新的Rserve进程(在另一个端口上侦听),还必须在相应的端口上建立一个新的Rserve连接。

RConnection connection = new RConnection(HOST, PORT);

如果您需要更多意见,请随时询问。如果愿意,我还可以提供完整的类代码,以使用Rserve创建多个R实例。

请参见Java class,我曾经用Rserve运行R的多个实例。