Как запустить mojolicious под Win32::Daemon?

Я пытаюсь запустить mojolicious как службу Windows с помощью Win32::Daemon, но я не знаю, как вернуться из обратного вызова start после запуска приложения 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 неблокирующим образом?


person Tucan    schedule 25.01.2012    source источник
comment
Как бы вы запустили его вручную (не как службу)? Я предполагаю, что это не запускает веб-сервер, на котором работает ваше приложение.   -  person Cornel Ghiban    schedule 25.01.2012
comment
Проверил, вебсервер запускается. Также, когда я запускаю его как службу, вы можете получить доступ к веб-приложению через веб-браузер. Проблема в том, что контроллер службы считает, что служба не завершила процесс запуска.   -  person Tucan    schedule 26.01.2012
comment
Обратите внимание, что неблокировка в веб-контексте часто означает нечто иное: сервер обрабатывает соединения неблокирующим/асинхронным способом.   -  person Øyvind Skaar    schedule 01.02.2012


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

person Tucan    schedule 07.02.2012

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

person Cornel Ghiban    schedule 26.01.2012