【问题标题】:Error in starting second JVM when one is already started已启动第二个 JVM 时出错
【发布时间】:2014-09-26 09:09:37
【问题描述】:

我正在开发一个客户端-服务器软件,其中服务器是由 python 开发的。我想从 python 中的 java 程序中调用一组方法。所有的 java 方法都存在于一个 jar 文件中。这意味着我不需要加载不同的 jars。

为此,我使用了 jpype。对于来自客户端的每个请求,我都会调用一个 python 函数,如下所示:

def test(self, userName, password):
    Classpath = "/home/DataSource/DMP.jar"
    jpype.startJVM(
        "/usr/local/java/jdk1.7.0_60/jre/lib/amd64/server/libjvm.so",
        "-ea",
        "-  Xmx512m",
        "-Djava.class.path=%s" % Classpath)

    NCh = jpype.JClass("Common.NChainInterface")
    n = NCh(self._DB_ipAddress, self._DB_Port, self._XML_SCHEMA_PATH, self._DSTDir)
    jpype.shutdownJVM()

对于一个函数它可以工作,但对于第二个调用它无法启动 jvm。 我看到很多抱怨,但我找不到任何解决方案。如果有任何机构可以提供帮助,我将不胜感激。

如果jpype多次启动jvm有问题,有没有办法一次启动和停止jvm?服务器部署在 Ubuntu 虚拟机上,但我没有足够的知识来编写例如为此目的的脚本。能否提供链接或示例?

【问题讨论】:

    标签: jpype


    【解决方案1】:

    startJVM() 之前检查isJVMStarted()
    如果JVM正在运行,则返回True,否则返回False

    def init_jvm(jvmpath=None):
        if jpype.isJVMStarted():
            return
        jpype.startJVM(jpype.getDefaultJVMPath())
    

    真实例子见here

    【讨论】:

      【解决方案2】:

      上述et9的回答没有解决这个问题。

      问题解释here

      实际上,您需要在服务器/模块级别启动/停止 JVM。

      我在单元测试中使用此方法多次调用都取得了成功。

      【讨论】:

        【解决方案3】:

        我已经通过在定义连接时添加这些行来解决它:

        if not jpype.isJVMStarted():
            jpype.startJVM(jvmPath, args)
        

        【讨论】:

          猜你喜欢
          • 2013-09-18
          • 1970-01-01
          • 2014-10-10
          • 2012-03-26
          • 1970-01-01
          • 2018-09-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多