3

我正在尝试使用 Win32::Daemon 将 mojolicious 作为 Windows 服务运行,但我不知道如何在启动 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 服务器?

4

2 回答 2

2

这就是我最终所做的:

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 服务器(请参阅文档)。使用上面的代码,Windows 将每 100 毫秒调用一次_running子程序(第二个StartService参数)。

于 2012-02-07T13:51:52.173 回答
0

如果你想要一个进程,在子进程和父进程中运行 Web 应用程序,让服务控制器知道一切运行良好。我很好奇在这种情况下你将如何停止服务:)

于 2012-01-26T14:30:13.783 回答