Как я могу запустить mojolicious под Win32 :: Daemon? - PullRequest
2 голосов
/ 25 января 2012

Я пытаюсь запустить mojolicious как службу Windows, используя Win32 :: Daemon, но я не знаю, как вернуться после обратного вызова start после запуска приложения mojo. Приложение mojo начинает слушать, но Windows Service Controller предполагает, что запуск не удался, потому что вы никогда не достигли оператора 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 ]

1 голос
/ 07 февраля 2012

Вот что я наконец-то сделал:

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 будет вызывать сабвуфер _running каждые 100 миллисекунд (второй StartService параметр).

0 голосов
/ 26 января 2012

Что если вы захотите запустить процесс, запустите веб-приложение на дочернем и родительском уровне, чтобы сервисный контроллер знал, что все работает нормально. Меня интересует, как вы остановите службу в этом случае:)

...