Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正在启动用于内联的JVM_Java_Perl_Jvm - Fatal编程技术网

Java 正在启动用于内联的JVM

Java 正在启动用于内联的JVM,java,perl,jvm,Java,Perl,Jvm,我有一个Perl脚本,它使用Inline::Java,只需fork(它是一个服务器,我希望它同时处理多个连接) 所以我想实现一个共享JVM,它使用shared\uJVM=>1。由于脚本退出时JVM没有关闭,因此我希望将其与START\u JVM=>0一起重用。但是,由于这可能是我第一次启动服务器,我还希望有一个BEGIN块,确保在调用use Inline之前JVM正在运行 我的问题很简单,但我在网上找不到任何答案:我如何简单地启动JVM?我看了manjava,似乎没有任何选项意味着“启动并侦听连

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

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

我的问题很简单,但我在网上找不到任何答案:我如何简单地启动JVM?我看了
manjava
,似乎没有任何选项意味着“启动并侦听连接”

下面是我试图在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\u jvm
子例程。

如果您有一个正在运行的
jvm\u
函数,只需使用它来确定Inline::Java是否应该启动jvm

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

由于提供了详细信息,我能够回答我自己的问题,这是基于一个错误的假设,即JVM本身提供了一个服务器和一个协议

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

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

$ java org.perl.inline.java.InlineJavaServer <DEBUG> <HOST> <PORT> <SHARED_JVM> <PRIVATE> <NATIVE_DOUBLES>
(并不是说应该对其进行定义:托宾克的解决方案虽然没有直接解决我提出的问题,但要好得多。)

至于
jvm\u正在运行的子例程,我是这样定义的:

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

Ta,没想到这一点我觉得有点傻。不过,如果您或其他人确实知道如何编写
start\uJVM
函数,我很想知道它应该如何工作。特别是查找变量
$cmd
的定义位置-这似乎是一个命令字符串。如果您编辑模块的版本以执行
打印STDERR$cmduse 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 };
}