我有一个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
子例程。
答案 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 };
}