Как отменить работу в очереди в 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, но я не могу понять, как удалить почтовый, например красная стрелка указывает сюда:
6 ответов
сделать это легче.
Не отправляйте электронное письмо с более поздней опцией. Вы должны отправить задание с более поздним вариантом, и это задание будет нести ответственность за отправку электронной почты.
внутри этого задания перед отправкой электронной почты проверьте пару emailAddress-sendTime. Если это правильно, отправьте письмо, если нет, верните true, и письмо не будет отправлено, и задание завершится.
надеюсь, что это помогает
$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
- это имя очереди / пробки, которая "по умолчанию" по умолчанию!
Я настроил новое приложение на своем сервере и установил (на свой собственный поддомен) этот веб-интерфейс для управления моим 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
Я думаю, вы могли бы достичь "отмена".