为Inline启动JVM

时间:2014-04-27 15:36:12

标签: java perl jvm

我有一个Perl脚本使用Inline::Java只有fork(它是一个服务器,我希望它同时处理多个连接)。

所以我想实现this solution,它使用SHARED_JVM => 1的共享JVM。由于脚本退出时JVM没有关闭,我希望将其重用于START_JVM => 0。但是因为它可能是我第一次启动服务器,所以我还希望有一个BEGIN块,以确保在调用use Inline之前JVM正在运行。

我的问题非常简单,但我在网上找不到任何答案:我如何简单地启动JVM?我看了man java,似乎没有任何选项意味着“开始只是听取连接”。

以下是我在Perl中尝试做的简化版本,如果这有帮助:

BEGIN {
    &start_jvm unless &jvm_is_running;
}

use Inline (
    Java       => 'STUDY',
    SHARED_JVM => 1,
    START_JVM  => 0,
    STUDY      => ['JavaStuff'],
);

if (fork) {
    JavaStuff->do_something;
    wait;
}
else {
    Inline::Java::reconnect_JVM();
    JavaStuff->do_something;
}

我需要帮助的是编写start_jvm子例程。

2 个答案:

答案 0 :(得分:2)

如果你有一个有效的jvm_is_running函数,只需用它来确定Inline :: Java是否应该启动JVM。

use Inline (
    Java       => 'STUDY',
    SHARED_JVM => 1,
    START_JVM  => jvm_is_running() ? 0 : 1,
    STUDY      => ['JavaStuff'],
);

答案 1 :(得分:0)

感谢tobyink,提供的详细信息,我能够回答我自己的问题,该问题基于错误的假设,即JVM本身提供服务器和protocole。

事实上,Inline::Java的一个主要组成部分是用Java编写的服务器,它处理Inline::Java::JVM客户端的请求,用Perl编写。

因此,启动服务器的命令行是:

$ java org.perl.inline.java.InlineJavaServer <DEBUG> <HOST> <PORT> <SHARED_JVM> <PRIVATE> <NATIVE_DOUBLES>

其中所有参数都对应于Inline::Java documentation.

中描述的配置选项

因此,在我的情况下,start_jvm子例程将是:

sub start_jvm {
    system
      'java org.perl.inline.java.InlineJavaServer 0 localhost 7891 true false false';
}

(不应该定义:tobyink的解决方案,虽然它没有直接解决我问的问题,但要好得多。)

至于jvm_is_running子程序,这就是我定义它的方式:

use Proc::ProcessTable;

use constant {
    JAVA          => 'java',
    INLINE_SERVER => 'org.perl.inline.java.InlineJavaServer',
};

sub jvm_is_running {
    my $pt = new Proc::ProcessTable;
    return grep {
        $_->fname eq JAVA && ( split /\s/, $_->cmndline )[1] eq INLINE_SERVER
    } @{ $pt->table };
}