我的要求 -
我需要在服务器中部署Java Web服务,该服务器在内部执行R scipt文件。我搜索了从Java调用R的各种解决方案,最好的是rJava和Rserve。使用Rserve我可以调用R函数BUT,因为我在Windows中运行它,它一次无法处理多个请求,我不想切换到Linux。
[编辑]
我尝试了什么 - 我用rJava来调用R函数:
String[] args = new String[3];
args[0] = "--quiet"; // Don't print startup message
args[1] = "--no-restore"; // Don't restore anything
args[2] = "--no-save";
String rFilePath = "D:/Dataset_Info/AI-KMS_v2.0/tika/src/main/resources/HSConcordance.R";
Rengine engine = new Rengine(args, false, null);
if (!engine.waitForR()) {
System.out.println("Cannot load R");
}
System.out.print("JRI R-Engine call: ");
engine.eval("source(\"" + rFilePath + "\")");
REXP value = engine.eval("as.integer(a<-simple())");
int a = value.asInt();
System.out.println(a);
Maven依赖 -
<dependency>
<groupId>com.github.lucarosellini.rJava</groupId>
<artifactId>JRI</artifactId>
<version>0.9-7</version>
</dependency>
<dependency>
<groupId>com.github.lucarosellini.rJava</groupId>
<artifactId>REngine</artifactId>
<version>0.9-7</version>
</dependency>
<dependency>
<groupId>com.github.lucarosellini.rJava</groupId>
<artifactId>JRIEngine</artifactId>
<version>0.9-7</version>
</dependency>
我的R脚本文件 -
simple<-function(){
a=1
return(a)
}
输出 - JRI R-Engine呼叫:1 然后它挂了。我调试了它,发现它卡在 Thread.class
中非常感谢任何形式的帮助。
答案 0 :(得分:1)
问题是当我第二次接到网络服务时它被绞死了,因为我们已经有一个Rengine存在的实例,它是在第一次调用时创建的。
Rengine re = Rengine.getMainEngine();
if(re == null){
re=new Rengine (new String [] {"--vanilla"}, false, null);
if (!re.waitForR())
{
System.out.println ("Cannot load R");
return "failure";
}
}
re.eval("source(\"" + rFilePath + "\")");
re.eval("copyfile(\""+filePath+"\")");
re.end();
几点需要注意 -
Rengine re = Rengine.getMainEngine();
re.end();
它可能会有所帮助。感谢。