当前位置: 首页 > 知识库问答 >
问题:

分离并附加RServe连接:无法连接

齐涛
2023-03-14

我正在尝试从Java分离并附加一个RServe会话。连接到RServe可以完美地工作,但连接会导致异常。

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());
    }
}

线程“main”org.rosuda.REngine.Rserve.Rserve异常:无法连接:连接被拒绝:连接到org.rosuda.REngine.Rserve.RConnection。(RConnection.java:90)org.rosuda.REngine.Rserve.RConnection。(RConnection.java:66)org.rosuda.REngine.Rserve.RSession.attach(RSession.java:36)com.company.korana.r\u interface.RToast.main(RToast.java:16)原因:java.net.ConnectException:连接被拒绝:java.net.DualStackPlainSocketImpl.connect0(本机方法)处的java.net.DualStackPlainSocketImpl.socketConnect(未知源)处的java.net.AbstractPlainSocketImpl.doConnect(未知源)处的java.net.AbstractPlainSocketImpl.connectToAddress(未知源)java.net.socksocketipl.connect(未知源)java.net.plainsocketipl.connect(未知源)java.net.socksocketipl.connect(未知源)java.net.Socket.connect(未知源)java.net.Socket.connect(未知源)java.net.Socket.(未知源)java.net.Socket.(未知源)在org.rosuda.REngine.Rserve.RConnection.(RConnection.java:85)…还有3个

Rserve使用默认端口在本地主机上运行。

编辑:我正在使用以下maven工件:

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

共有1个答案

韦衡
2023-03-14

在对源进行检查后,发现当分离时,Rserver会话会监听随机分配的端口。

Rserv.c,第1781行

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

因此,客户端和服务器之间需要访问的端口介于32768和65000之间。在我的例子中,这不起作用,因为我在使用docker。

编辑:我构建了一个解决方案,可以在docker中使用Rserver,而无需打开大量端口(这与docker不太兼容)。下面的狙击手取代了我的install.packages(“雷瑟”):

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

这修改了Rserver源,使端口位于[53000, 53100[范围内,这在我的情况下就足够了。

 类似资料:
  • 我有一个现有的2个kafka服务器加载了mysql连接器。它起作用了。此外,我需要添加MongoDB连接器。我已经在我的Kafka服务器(Centos7)上安装了confluent schema registry,它可以工作,我停止/启动/重新启动,看起来没有什么问题。我在这里下载并提取了debezium Mongo插件/usr/连接器/插件/debezium连接器mongodb/ 我编辑了 /e

  • 我有div,可以拖放到绘图区域。可以使用鼠标从源endpoint拖放到目标endpoint手动连接这些div。在这样创建的连接上,连接被分离,但endpoint保留,删除的连接可以通过上述相同的手动过程重新创建。现在,我还将以json格式的连接节点流程图形式的绘图保存到磁盘文件中。在加载文件时,流程图会完美地显示所有连接和节点。现在我在点击一个节点时删除一个连接,它就可以工作了。但是现在我不能再次

  • 问题内容: 我正在使用Spring Boot并通过jpahibernate。我正在使用JpaRepository接口来实现我的存储库。与以下UserRepository一样 我想实现以下目标 加载用户实体。 更改实体对象的状态,例如user.setName(“ foo”) 进行外部系统Web服务调用。将通话结果保存到数据库中 仅在成功响应此Web服务调用后,才将用户的新状态保存在存储库中。 以上所

  • 我正在尝试在我创建的appender下自动连接SQSFIFOJavaClient。我打印出了Spring Boot主类中定义的bean名称,并且能够看到定义的SQSFIFOJavaClient bean。但是,bean没有在下面列出的类中自动连接。SQSApender和SQSFIFOJavaClient都位于不同的包中,但位于添加到组件扫描的相同基本包下。你能告诉我这里缺少什么吗? 我也尝试添加D

  • 我是jsPlumb的新手,我遇到了一个源和目标相同的连接问题。我必须禁止这些类型的连接,我认为最好的方法是:当我完成创建连接时,如果它具有相同的sourceId和targetId,则删除连接。我正在这样做: 连接被删除,但看起来源endpoint仍然存在,但是,如果我拖动该项目,点会停留在相同的地方,就好像它不再引用该项目一样,这是可以的,因为连接被删除了,但它不是好吧,因为那个点不应该在那里。

  • 连接到hadoop时,出现以下错误 线程“main”java.lang.AbstractMethodError中出现异常:org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider。getProxy()Lorg/apache/hadoop/io/retry/failoverproxy提供程序$ProxyInfo