Grails - трудоемкая обработка в контроллере
В настоящее время у меня есть контроллер, который выполняет небольшую тяжелую обработку (массовая обработка CSV-файлов - файлы CSV размером от 150 МБ до 400 МБ). Файлы CSV загружаются во временную папку. Обработка выполняется службой, которая передает местоположение файла API-интерфейсам из внешнего jar-файла (базовый вызов Java-API - никаких вызовов веб-служб или чего-либо еще). Сервисный метод возвращается примерно 2-3 раза, и пользователь должен ждать в настоящее время этого времени для завершения обработки и загрузки страницы после отправки формы - не лучший пользовательский опыт.
Пользователи Grails, которые столкнулись с такой проблемой, как лучше всего решить эту проблему? Я новичок в Grails и JavaEE, и, следовательно, это в основном вопрос о том, как создать такую систему и какие библиотеки доступны для этого.
Я немного погуглил по этому вопросу. Люди ответили JMS, RabbitMQ и т. Д. Как решение подобных проблем. Но они, кажется, меняют муху с помощью своего рода решения для моего ума. Ваши предложения очень ценятся.
Спасибо.
2 ответа
Вы можете использовать аннотацию Spring @Async для метода службы, если хотите, чтобы этот метод выполнялся в другом потоке. Это подход, который я использую в своих приложениях Grails, он очень прост.
Вот пример того, как его настроить: http://tux2323.blogspot.co.uk/2012/05/grails-and-spring-async-annotation.html?m=1
Использовать quartz
плагин... заставить контроллер планировать немедленное задание (планирование будет быстрым, и пользователь сразу же получит ответ, и обработка будет выполнена в кварцевом задании, которое выполняется в другом потоке). Просто уведомите пользователя, когда вся работа сделана (отправьте электронное письмо или что-то еще).
В качестве альтернативы используйте executor
плагин, чтобы начать работу в новой теме. 2.3 будет иметь поддержку Async, которая может помочь здесь.