ActiveJob используется для создания задач, которые выполняются в фоновом режиме и асинхронно из потока запросов / ответов HTTP.Контроллер передает задачу ActiveJob, затем контроллер возвращается, пока задание выполняется в будущем.Если вам нужен вывод из задания немедленно, потому что это что-то, что нужно пользователю, то вам не следует использовать задание - вы просто должны вызывать код, вызываемый заданием напрямую, и блокировать, пока код не будет завершен, чтобы вы могли получить вывод.
def create
if geo_params[:address]
geo = GeocoderService.new(geo_params[:address])
result = geo.parse_address
render json: result
else
render json: { error: "Invalid address"}, status: 400
end
end
Если вы действительно обеспокоены блокировкой, которую будет выполнять действие вашего контроллера, пока оно ожидает ответа от API геолокации, вы можете создать собственную систему очередей для своих пользователей API.Поток выглядит примерно так:
- Пользователь делает запрос к вашей конечной точке
- Ваша конечная точка вставляет запись в таблицу базы данных с именем GeoResults со статусом «обработка»,и пустой текст ответа.Получите идентификатор этой записи.
- Ваша конечная точка запускает работу, как вы делаете сейчас, но теперь вы также передаете идентификатор записи GeoResults, которую вы создали.
- Ваша конечная точка даетпользователю URL-адрес для проверки этой записи в GeoResults.
- Ваш потребитель начинает опрашивать эту конечную точку, пока не увидит состояние «завершено»
- Когда ваше фоновое задание завершено, он обновляет свою записьв GeoResults (так как он имеет идентификатор) со статусом «завершено» и назначает текст ответа геолокации.
- Ваш потребитель видит обновление и получает ответ.