@zifmezin

Как отправить уведомление об успешно завершенном worker Yii2 Queue?

Друзья, помогите пожалуйста решить задачку.
Имеется GridView, в котором реализовал возможность отправки нескольких строк в задачу.
Каждая строка (id и title) отправляется в отдельную задачу, где выполняется долгий запрос к API.
В воркере происходит получение данных по API и сохранение в соответствующей (по id) модели.

Все бы хорошо, но уже третий день не могу решить - как оповещать в интерфейсе, что такая-то строка получила данные? Пока не обновишь страницу и не найдешь в таблице эту строку - не поймешь.

Логично, что можно навесить событие yii\queue\Queue::EVENT_BEFORE_EXEC и обновить страницу, отправив session->setFlash(), что я и попытался сделать:
В конфиге:
'on '.yii\queue\Queue::EVENT_BEFORE_EXEC => function($event) {
                $model = new Model;
                $model->trigger(Model::EVENT_NAME);
            },

В моделе:
public function init()
    {
        $this->on(Model::EVENT_NAME, function(){
            Yii::$app->session->setFlash('success', "Ok");
        });
        parent::init();
    }

Но такая схема не срабатывает, так как в console нет session.

Дальше я пытался обойти это, вызвав экшен в контроллере веб-приложения (отключая при это Csrf):
'on '.yii\queue\Queue::EVENT_BEFORE_EXEC => function($event) {
                Yii::$app->controllerNamespace = "backend\controllers";
                Yii::$app->runAction('default/event');
            },

Но тоже все безуспешно, так как метод redirect() в этом экшене не может быть вызван из консольного приложения.

Пока писал - вдруг сам понял бредовость своих мыслей)) как глупо было бы отправлять запрос на обновление страницы в то время, когда ты пользуешься сайтом.

Получается, однозначно нужно это делать без перезагрузки страницы - значит скорее всего с помощью ajax.
Как вообще такие задачи решаются?
  • Вопрос задан
  • 31 просмотр
Пригласить эксперта
Ответы на вопрос 1
@KingstonKMS
Так и решаются, с помощью ajax или вебсокет.
Вы можете хранить очередь в базе, при пуше задачи вы получаете ид и последующем проверяете очередь на завершенность.
Подробнее про очереди
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы