Java 正在启动用于内联的JVM
我有一个Perl脚本,它使用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,似乎没有任何选项意味着“启动并侦听连
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$cmd此时,您应该可以看到完整的命令字符串。
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 };
}