我正在尝试使用Win32 :: Daemon作为Windows服务运行mojolicious,但我不知道如何在启动mojo应用程序后从启动回调返回。 mojo应用程序开始监听,但Windows服务控制器假定启动失败,因为您从未到达return语句。
sub Callback_Start
{
my( $Event, $Context ) = @_;
app->start; # <-- code hangs here
$Context->{last_state} = SERVICE_RUNNING;
Win32::Daemon::State( SERVICE_RUNNING );
return();
}
是否可以以非阻塞方式启动Mojo服务器?
答案 0 :(得分:1)
这就是我最终完成的事情:
my $daemon = Mojo::Server::Daemon->new( app => app, listen => ['http://*:3000' ] );
$daemon->prepare_ioloop;
Win32::Daemon::StartService( \%context, 100 );
Win32::Daemon::RegisterCallbacks({
start => \&_start,
running => \&_running,
stop => \&_stop,
pause => \&_pause,
continue => \&_continue,
});
# ...
sub _running {
my( $Event, $context ) = @_;
if( SERVICE_RUNNING == Win32::Daemon::State() ) {
$daemon->ioloop->one_tick;
}
}
sub _start {
my ($event, $context ) = @_;
$context->{last_state} = SERVICE_RUNNING;
$context->{last_event} = $event;
Win32::Daemon::State( SERVICE_RUNNING );
return();
}
# ...
重复调用 one_tick 方法可以嵌入Mojo服务器(请参阅doc)。使用上面的代码,Windows将每100毫秒(第二个 StartService 参数)调用 _running 子。
答案 1 :(得分:0)
如果你想要一个进程,在子进程和父进程中运行web应用程序,让服务控制器知道一切正常运行。我很好奇你在这种情况下如何停止服务:)