如何在Win32 :: Daemon下运行mojolicious?

时间:2012-01-25 14:23:11

标签: perl mojolicious

我正在尝试使用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服务器?

2 个答案:

答案 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应用程序,让服务控制器知道一切正常运行。我很好奇你在这种情况下如何停止服务:)