Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Laravel或Redis中取消排队作业_Laravel_Redis_Queue_Delay_Jobs - Fatal编程技术网

如何在Laravel或Redis中取消排队作业

如何在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')])

如何浏览我的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应用程序中编写一个网页,让这对我来说很容易。

或者也许有一些工具已经让这变得很容易(也许是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();