Как отменить работу в очереди в Laravel или Redis

Как я могу просмотреть все отложенные задания в моей очереди Redis, чтобы я мог отменить отправку, которая имеет определенную пару emailAddress-sendTime?

Я использую Laravel 5.5 и имею отправляемый, который я успешно использую следующим образом:

$sendTime = Carbon::now()->addHours(3);
Mail::to($emailAddress)
      ->bcc([config('mail.supportTeam.address'), config('mail.main.address')])
                    ->later($sendTime, new MyCustomMailable($subject, $dataForMailView));

когда этот код запускается, задание добавляется в мою очередь Redis.

Я уже прочитала Laravel docs но все еще остается в замешательстве.

Как я могу отменить отправку по почте (предотвратить его отправку)?

Я хотел бы закодировать веб-страницу в моем приложении Laravel, что делает это легким для меня.

или, может быть, есть инструменты, которые уже делают это легко (может быть, FastoRedis?)? В этом случае Инструкции о том, как достичь этой цели таким образом, также были бы действительно полезны. Спасибо!

обновление:

Я пробовал просматривать очередь Redis с помощью FastoRedis, но я не могу понять, как удалить почтовый, например красная стрелка указывает сюда: enter image description here

6 ответов


сделать это легче.

Не отправляйте электронное письмо с более поздней опцией. Вы должны отправить задание с более поздним вариантом, и это задание будет нести ответственность за отправку электронной почты.

внутри этого задания перед отправкой электронной почты проверьте пару emailAddress-sendTime. Если это правильно, отправьте письмо, если нет, верните true, и письмо не будет отправлено, и задание завершится.


удаление всех заданий в очереди:

Redis::command('flushdb');

надеюсь, что это помогает

$connection = null;
$default = 'default';

//For the delayed jobs
var_dump( \Queue::getRedis()->connection($connection)->zrange('queues:'.$default.':delayed' ,0, -1) );

//For the reserved jobs
var_dump( \Queue::getRedis()->connection($connection)->zrange('queues:'.$default.':reserved' ,0, -1) );

$connection - Это имя соединения Redis, которое по умолчанию равно null, и $queue - это имя очереди / пробки, которая "по умолчанию" по умолчанию!

источник:https://stackoverflow.com/a/42182586/6109499


Я настроил новое приложение на своем сервере и установил (на свой собственный поддомен) этот веб-интерфейс для управления моим Redis:https://github.com/ErikDubbelboer/phpRedisAdmin

Это позволяет мне редактировать или удалять ключи и значения ZSet, которые, похоже, как Laravel delayed Mailables сохраняются в очереди.

другой подход, который работал для меня было установить Redis Desktop Manager на моем ПК с Windows.

думаю, я предпочту phpRedisAdmin, так как я смогу получить доступ к нему из интернета (используя любое устройство).


один из подходов может заключаться в том, чтобы ваша работа проверяла, установлен ли определенный адрес/время для отмены (удаления из очереди). Настройте таблицу базы данных или кэшируйте значение навсегда с адресом / временем в массиве. Тогда в вашей работе handle метод проверьте, было ли что-нибудь отмечено для удаления и сравните его с адресом/временем обработки mailable:

public function handle()
{
     if (Cache::has('items_to_remove')) {
         $items = Cache::get('items_to_remove');
         $removed = null;
         foreach ($items as $item) {
             if ($this->mail->to === $item['to'] && $this->mail->sendTime === $item['sendTime']) {
                  $removed = $item;
                  $this->delete();
                  break;
             }
         }
         if (!is_null($removed)) {
             $diff = array_diff($items, $removed);
             Cache::set(['items_to_remove' => $diff]);
         }
      }
  }

может быть, вместо того, чтобы отменить его, вы можете удалить его из Redis, из того, что я прочитал из официальные документы о forget command на Redis и от Laravel официальный док взаимодействует с redis вы можете в основном вызвать любой Redis команда из интерфейса, если вы можете вызвать и передать node_id который в этом случае я думаю, что это то число, которое у вас есть в вашем изображении DEL 1517797158 Я думаю, вы могли бы достичь "отмена".