如何在Laravel或Redis中取消排队作业
如何浏览我的Redis队列中所有挂起的作业,以便取消具有特定emailAddress sendTime对的邮件? 我正在使用Laravel 5.5,并且有一个我正在成功使用的邮件,如下所示:如何在Laravel或Redis中取消排队作业,laravel,redis,queue,delay,jobs,Laravel,Redis,Queue,Delay,Jobs,如何浏览我的Redis队列中所有挂起的作业,以便取消具有特定emailAddress sendTime对的邮件? 我正在使用Laravel 5.5,并且有一个我正在成功使用的邮件,如下所示: $sendTime = Carbon::now()->addHours(3); Mail::to($emailAddress) ->bcc([config('mail.supportTeam.address'), config('mail.main.address')])
$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应用程序中编写一个网页,让这对我来说很容易。
或者也许有一些工具已经让这变得很容易(也许是FastoRedis?)?在这种情况下,关于如何以这种方式实现这一目标的说明也会非常有用。谢谢
更新:
我曾尝试使用FastoRedis浏览Redis队列,但我不知道如何删除可邮件,例如红色箭头指向此处:
更新:
看看综合性的。希望这有帮助
$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连接名称,默认为空,$queue
是队列/管道的名称,默认为“默认”
资料来源:综合答案:
我现在使用自己的自定义DispatchableWithControl特性,而不是Dispatchable特性
我这样称呼它:
$executeAt = Carbon::now()->addDays(7)->addHours(2)->addMinutes(17);
SomeJobThatWillSendAnEmailOrDoWhatever::dispatch($contactId, $executeAt);
namespace-App\Jobs;
使用App\Models\Automation;
使用碳\碳;
使用Illumb\Foundation\Bus\PendingDispatch;
使用日志;
特征可调度控制{
使用\Lightning\Foundation\Bus\Dispatchable{//https://stackoverflow.com/questions/40299080/is-there-a-way-to-extend-trait-in-php
\Illumb\Foundation\Bus\Dispatchable::作为parentDispatch进行调度;
}
/**
*使用给定的参数分派作业。
*
*@return\light\Foundation\Bus\pendingspatch
*/
公共静态函数分派(){
$args=func_get_args();
如果(计数($args)<2){
$args[]=Carbon::now(TT::UTC);//如果未提供$executeAt,请使用“now”(无延迟)
}
列表($contactId,$executeAt)=$args;
$newAutomationArray=[
“联系人id”=>$contactId,
“作业类名称”=>静态::类,
'execute\u at'=>$executeAt->format(TT::MYSQL\u DATETIME\u格式)
];
调试(json_编码($newAutomationArray));
自动化::创建($newAutomationArray);
$pendingDispatch=newPendingDispatch(新静态(…$args));
返回$pendingDispatch->delay($executeAt);
}
/**
*@param int$contactId
*@param Carbon$executeAt
*@返回布尔值
*/
公共函数检查是否应执行($contactId,$executeAt){
$2.0[
“联系人id”=>$contactId,
“作业类名称”=>静态::类,
'execute\u at'=>$executeAt->format(TT::MYSQL\u DATETIME\u格式)
];
Log::debug('checkwheeshouldexecute'.json_encode($conditionToMatch));
$automation=automation::where($conditionTomatch)->first();
if(自动化){
$automation->delete();
Log::debug('checkwheeshouldexecute=true,所以软删除记录');
返回true;
}否则{
返回false;
}
}
}
所以,现在我可以查看我的“自动”表以查看挂起的作业,如果我想阻止作业执行,我可以删除(或软删除)任何这些记录。一种方法可能是让您的作业检查,以查看您是否已设置要取消的特定地址/时间(从队列中删除)。设置数据库表或在数组中永久缓存带有地址/时间的值。然后在作业的
handle
方法中,检查是否有标记要删除的内容,并将其与邮件的地址/处理时间进行比较:
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上删除它,从我在Redis上读到的内容中,你基本上可以从界面调用任何
Redis
命令,如果您可以调用forget
命令并实际传递node\u id
,在这种情况下,我认为这就是您图像中的编号DEL 1517797158
,我认为您可以实现“取消”。会更容易
不要发送带有后一选项的电子邮件。您必须使用“晚一点”选项发送作业,此作业将负责发送电子邮件
在此作业中,在发送电子邮件之前,请检查emailAddress sendTime对。如果正确,则发送电子邮件;如果不正确,则返回true,电子邮件将不会发送,作业将完成。删除所有排队作业:
Redis::command('flushdb');
我使用redis cli运行了以下命令:
KEYS *queue*
在持有排队作业的Redis实例上,
然后删除响应中显示的任何键
DEL queues:default queues:default:reserved
按id删除作业
$job = (new \App\Jobs\SendSms('test'))->delay(5);
$id = app(Dispatcher::class)->dispatch($job);
$res = \Illuminate\Support\Facades\Redis::connection()->zscan('queues:test_queue:delayed', 0, ['match' => '*' . $id . '*']);
$key = array_keys($res[1])[0];
\Illuminate\Support\Facades\Redis::connection()->zrem('queues:test_queue:delayed', $key);
从队列中删除作业
$this->delete();
看看Laravel Horizon,不过我确实认为不可能取消那里的工作。我也在想,你可以查询你的邮件作业并删除它?嗨,Ryan,请按右键并选择编辑。对我(最初的询问者)有效的答案是:假设
var\u dump
会显示足够的详细信息(例如延迟的Mailable
的emailAddress
和sendTime
),我如何选择一个并将其从队列中完全删除(删除它)var_dump
显示的内容并不比我通过FastoRedis看到的内容多。我刚刚更新了我的问题,向您展示了一个屏幕截图。我如何删除红色箭头指向的邮件?我尝试运行DEL 1517797158
,但这似乎不起作用。我怀疑“1517797158”是关键。谢谢。我感谢你的回答,但我认为它不适用于这里。在什么作业的处理方法中?正如你在我的问题中看到的,电子邮件通过->later()
排队,然后我的代码再也看不到它了。它被处理了
$job = (new \App\Jobs\SendSms('test'))->delay(5);
$id = app(Dispatcher::class)->dispatch($job);
$res = \Illuminate\Support\Facades\Redis::connection()->zscan('queues:test_queue:delayed', 0, ['match' => '*' . $id . '*']);
$key = array_keys($res[1])[0];
\Illuminate\Support\Facades\Redis::connection()->zrem('queues:test_queue:delayed', $key);
$this->delete();