Я пытаюсь создать слабое приложение на Perl с mojolicious, и у меня следующий сценарий использования:
Slack отправляет запрос в мой API из команды слэша и требует ответа в течение 3 секунд. Тем не менее, Slack также дает мне возможность отправить до 5 дополнительных ответов в течение 30-минутного периода, но все еще нуждается в первоначальном ответе через 3 секунды (он просто отправляет "late_response_url" при первоначальном обратном вызове, чтобы я мог что-то POST к этому URL позже). В моем случае я хотел бы отправить начальный ответ Slack, чтобы сообщить пользователю, что операция «выполняется», и через некоторое время отправить фактический результат моей медленной функции в Slack.
В настоящее время я могу сделать это, порождая второй процесс с использованием fork () и используя один процесс для немедленного ответа, как того требует Slack, а второй - для выполнения остальной части работы и ответа позже.
Я пытаюсь сделать это с помощью подпроцессов Mojolicious, чтобы избежать использования fork (). Однако я не могу найти способ заставить это работать ....
пример кода того, что я уже делаю с fork, выглядит так:
sub withpath
{
my $c = shift;
my $user = $c->param('user_name');
my $response_body = {
response_type => "ephemeral",
text => "Running for $user:",
attachments => [
{ text => 'analyze' },
],
};
my $pid = fork();
if($pid != 0){
$c->render( json => $response_body );
}else{
$output = do_time_consuming_things()
$response_body = {
response_type => "in-channel",
text => "Result for $user:",
attachments => [
{ text => $output },
],
};
my $ua = Mojo::UserAgent->new;
my $tx = $ua->post(
$response_url,
{ Accept => '*/*' },
json => $response_body,
);
if( my $res = $tx->success )
{
print "\n success \n";
}
else
{
my $err = $tx->error;
print "$err->{code} response: $err->{message}\n" if $err->{code};
print "Connection error: $err->{message}\n";
}
}
}
Так что проблема в том, что, как бы я ни пытался, я не мог воспроизвести точно такой же код с подпроцессами Mojolicious. Есть идеи?
Заранее спасибо!