3

Win32::Daemon を使用して mojolicious を Windows サービスとして実行しようとしていますが、mojo アプリを起動した後に start コールバックから戻る方法がわかりません。mojo アプリはリッスンを開始しますが、return ステートメントに到達しないため、Windows サービス コントローラーは開始が失敗したと見なします。

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サブルーチンを呼び出します (2 番目のStartServiceパラメータ)。

于 2012-02-07T13:51:52.173 に答える
0

プロセスが必要な場合は、子で Web アプリを実行し、親でサービス コントローラーにすべてが正常に実行されていることを知らせます。この場合、どのようにサービスを停止するかについて興味があります:)

于 2012-01-26T14:30:13.783 に答える