2012-01-25 26 views
2

我試圖使用Win32 :: Daemon作爲Windows服務運行mojolicious,但我不知道如何在啓動mojo應用程序後從啓動回調中返回。 mojo應用程序開始偵聽,但Windows服務控制器認爲啓動失敗,因爲您永遠不會到達return語句。如何在Win32 :: Daemon下運行mojolicious?

sub Callback_Start 
{ 
    my($Event, $Context) = @_; 

    app->start; # <-- code hangs here 

    $Context->{last_state} = SERVICE_RUNNING; 
    Win32::Daemon::State(SERVICE_RUNNING); 
    return(); 
} 

是否可以以非阻塞方式啓動Mojo服務器?

+0

你會如何手動啓動它(而不是服務)?我的猜測是,這無法啓動運行你的應用程序的網絡服務器。 –

+0

檢查Web服務器是否啓動。另外,當我將其作爲服務啓動時,您可以通過Web瀏覽器訪問Web應用程序。問題是服務控制器認爲服務沒有完成啓動過程 – Tucan

+0

請注意,Web上下文中的「非阻塞」通常意味着其他內容:serever以非阻塞/異步方式處理連接 –

回答

0

如果你想要一個進程,在子進程和父進程中運行Web應用程序,讓服務控制器知道一切運行正常。我怎麼你會在這種情況下:)停止服務珍玩

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方法repeteadly允許你嵌入的Mojo服務器(見doc)。使用Windows上面的代碼將每100毫秒調用一次_running(第二個參數StartService參數)。

相關問題