В приложении Mojolicious я пытаюсь преобразовать файлы ODT в HTML при нажатии на ссылку. Я конвертирую файлы с помощью команды оболочки «soffice». Преобразование файлов занимает некоторое время. Я отправляю сообщения о состоянии пользователю, чтобы уведомить его о ходе выполнения. Я отправляю эти сообщения об обновлении статуса, записывая их в объект Mojo::Log. Затем я подписываюсь на этот объект журнала в маршруте EventSource.
Затем я перебираю файлы и использую AnyEvent::Util run_cmd для выполнения внешней программы «soffice».
for my $file (@{ $filelist }) {
my $output_dir = './output_dir';
my $cmd = "soffice --headless --convert-to html --outdir '$output_dir' '$file'";
my $cv = AnyEvent->condvar;
my $w;
$w = run_cmd($cmd,
'>' => sub { my $out = shift;
&WriteToLog({ status => "cmd output '$out'..." });
undef $w;
$cv->send;
},
'2>' => sub { my $err = shift;
&WriteToLog({ status => "ERROR '$err'..." });
undef $w;
$cv->send;
}
);
$cv->recv;
}
В значительной степени скопировано и вставлено из основных руководств AnyEvent. Если нужно конвертировать всего несколько файлов (около 2 или 3), то все идет хорошо. Сообщения о состоянии, отправленные через соединение EventSource, отображаются в браузере клиента. Затем, после преобразования всех файлов, отображается веб-страница.
Если необходимо обработать больше файлов, несколько файлов будут преобразованы, тогда появится сообщение об ошибке в заголовке темы.
Маршрутизация для маршрута, содержащего приведенный выше код, такова:
my $initdocs = $r->under->to('docroute#initdocs');
$initdocs->get('/showdocs')->to('docroute#showdocs');
Приведенный выше код находится в маршруте «initdocs».
Любая помощь приветствуется. Заранее спасибо.