Вот что я наконец-то сделал:
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 параметр).