[REDIS] Laravel 또는 레디 스에서 작업을 대기 취소하는 방법
REDISLaravel 또는 레디 스에서 작업을 대기 취소하는 방법
내 레디 스 내가 어떤 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));
때이 코드를 실행, 직장 내 레디 스 큐에 추가됩니다.
난 이미 Laravel의 문서를 읽은하지만 혼란 상태로 유지됩니다.
어떻게이 메일을 보낼 수를 취소 할 수 있습니다 (이것은 전송 방지)?
나는 코드에 나를 위해이 용이하게 내 Laravel 응용 프로그램 내에서 웹 페이지를 싶네요.
아니면 이미이 쉽게 도구가 (어쩌면 FastoRedis은?)? 이 경우,이 목표를 그런 식으로 달성하는 방법에 대한 지침도 정말 도움이 될 것입니다. 감사!
최신 정보:
나는 FastoRedis를 사용하여 레디 스 큐를 검색하려고했지만, 나는 그런 여기에 빨간색 화살표 포인트로 메일을 보낼 수를 삭제하는 방법을 알아낼 수 없습니다 :
나는 아래에 제공된 포괄적 인 답변을 봐.
해결법
-
==============================
1.모든 대기 작업을 제거 :
모든 대기 작업을 제거 :
Redis::command('flushdb');
-
==============================
2.쉽게합니다.
쉽게합니다.
나중에 옵션으로 이메일을 보내하지 마십시오. 당신은 나중에 옵션으로 작업을 파견해야하며,이 작업은 이메일을 보낼 책임이 있습니다.
이 작업 내부 전에 시간이 지불 한 이메일 주소-전송을 확인, 이메일을 보낼 수 있습니다. 올바른 경우, 이메일을 보낼 경우, true를 반환하고 이메일이 전송되지 않고 작업이 완료됩니다.
-
==============================
3.나는 지금 디스패치 특성 대신 내 자신의 사용자 정의 DispatchableWithControl의 특성을 사용합니다.
나는 지금 디스패치 특성 대신 내 자신의 사용자 정의 DispatchableWithControl의 특성을 사용합니다.
나는 다음과 같이 호출 :
$executeAt = Carbon::now()->addDays(7)->addHours(2)->addMinutes(17); SomeJobThatWillSendAnEmailOrDoWhatever::dispatch($contactId, $executeAt);
namespace App\Jobs; use App\Models\Tag; use Carbon\Carbon; use Exception; use Illuminate\Bus\Queueable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use Log; class SomeJobThatWillSendAnEmailOrDoWhatever implements ShouldQueue { use DispatchableWithControl, InteractsWithQueue, Queueable, SerializesModels; protected $contactId; protected $executeAt; /** * * @param string $contactId * @param Carbon $executeAt * @return void */ public function __construct($contactId, $executeAt) { $this->contactId = $contactId; $this->executeAt = $executeAt; } /** * Execute the job. * * @return void */ public function handle() { if ($this->checkWhetherShouldExecute($this->contactId, $this->executeAt)) { //do stuff here } } /** * The job failed to process. * * @param Exception $exception * @return void */ public function failed(Exception $exception) { // Send user notification of failure, etc... Log::error(static::class . ' failed: ' . $exception); } }
namespace App\Jobs; use App\Models\Automation; use Carbon\Carbon; use Illuminate\Foundation\Bus\PendingDispatch; use Log; trait DispatchableWithControl { use \Illuminate\Foundation\Bus\Dispatchable {//https://stackoverflow.com/questions/40299080/is-there-a-way-to-extend-trait-in-php \Illuminate\Foundation\Bus\Dispatchable::dispatch as parentDispatch; } /** * Dispatch the job with the given arguments. * * @return \Illuminate\Foundation\Bus\PendingDispatch */ public static function dispatch() { $args = func_get_args(); if (count($args) < 2) { $args[] = Carbon::now(TT::UTC); //if $executeAt wasn't provided, use 'now' (no delay) } list($contactId, $executeAt) = $args; $newAutomationArray = [ 'contact_id' => $contactId, 'job_class_name' => static::class, 'execute_at' => $executeAt->format(TT::MYSQL_DATETIME_FORMAT) ]; Log::debug(json_encode($newAutomationArray)); Automation::create($newAutomationArray); $pendingDispatch = new PendingDispatch(new static(...$args)); return $pendingDispatch->delay($executeAt); } /** * @param int $contactId * @param Carbon $executeAt * @return boolean */ public function checkWhetherShouldExecute($contactId, $executeAt) { $conditionsToMatch = [ 'contact_id' => $contactId, 'job_class_name' => static::class, 'execute_at' => $executeAt->format(TT::MYSQL_DATETIME_FORMAT) ]; Log::debug('checkWhetherShouldExecute ' . json_encode($conditionsToMatch)); $automation = Automation::where($conditionsToMatch)->first(); if ($automation) { $automation->delete(); Log::debug('checkWhetherShouldExecute = true, so soft-deleted record.'); return true; } else { return false; } } }
그래서, 지금은 작업을 보류 볼 수 내 '자동화'표에서 볼 수, 나는 실행에서 작업을 방지하려면 나는 그 기록의 삭제 (또는 소프트 삭제) 할 수 있습니다.
내 레디 스를 관리하기 위해이 웹 인터페이스를 내 서버에 새 응용 프로그램을 설정하고 (자신의 하위 도메인) 설치 : https://github.com/ErikDubbelboer/phpRedisAdmin
그것은 Laravel은 Mailables가 큐에 저장받을 지연 방법이 될 것으로 보인다 편집 또는 삭제 ZSET 키와 값, 날 수 있습니다.
나를 위해 일한 또 다른 방법은 내 Windows PC에서 레디 스 바탕 화면 관리자를 설치하는 것이 었습니다.
나는 (어떤 장치를 사용) 웹에서 액세스 할 수 있습니다 때문에 내가 phpRedisAdmin을 선호하는 것 같아요.
-
==============================
4.어쩌면 대신을 취소 당신은 실제로 필자는 당신이 부를 수있는 경우 기본적으로 인터페이스에서 모든 레디 스 명령을 호출 할 수 있습니다 레디 스와 상호 작용 레디 스와 Laravel 공식 문서에서 명령을 잊지에 대한 공식 문서에서 읽은 내용에서의 레디 스에서 제거 할 수 있습니다 명령을 잊지 실제로이 경우에 나는 그것이 내가 당신이 "취소"달성 할 수 있다고 생각 당신이 당신의 이미지 DEL 1517797158에있는 그 수 있다고 생각 NODE_ID를 전달합니다.
어쩌면 대신을 취소 당신은 실제로 필자는 당신이 부를 수있는 경우 기본적으로 인터페이스에서 모든 레디 스 명령을 호출 할 수 있습니다 레디 스와 상호 작용 레디 스와 Laravel 공식 문서에서 명령을 잊지에 대한 공식 문서에서 읽은 내용에서의 레디 스에서 제거 할 수 있습니다 명령을 잊지 실제로이 경우에 나는 그것이 내가 당신이 "취소"달성 할 수 있다고 생각 당신이 당신의 이미지 DEL 1517797158에있는 그 수 있다고 생각 NODE_ID를 전달합니다.
-
==============================
5.도움이 되었기를 바랍니다
도움이 되었기를 바랍니다
$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) );
$ 연결은 널 (null)이 기본적으로 인 레디 스 연결 이름이며, $ 큐는 '기본'디폴트로 큐 / 튜브의 이름입니다!
출처 : https://stackoverflow.com/a/42182586/6109499
-
==============================
6.한 가지 방법은 당신이 (큐에서 삭제) 취소 할 수있는 특정 주소 / 시간을 설정 한 경우 확인하려면 작업 확인을 할 수 있습니다. 설정 데이터베이스 테이블 또는 캐시 배열의 주소 / 시간이 영원히 값. 그런 다음 작업의 handle 메소드 검사에서 아무것도 제거 용으로 표시되어있는 경우 및 처리중인 메일을 보낼 수의 주소 / 시간과 비교 :
한 가지 방법은 당신이 (큐에서 삭제) 취소 할 수있는 특정 주소 / 시간을 설정 한 경우 확인하려면 작업 확인을 할 수 있습니다. 설정 데이터베이스 테이블 또는 캐시 배열의 주소 / 시간이 영원히 값. 그런 다음 작업의 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]); } } }
-
==============================
7.내가이 명령을 실행 레디 스 - CLI를 사용하여 :
내가이 명령을 실행 레디 스 - CLI를 사용하여 :
KEYS *queue*
레디 스 인스턴스 개최 대기 작업에, 다음 어떤 키가 응답 나타났다 삭제
DEL queues:default queues:default:reserved
from https://stackoverflow.com/questions/48255735/how-to-cancel-queued-job-in-laravel-or-redis by cc-by-sa and MIT license
'REDIS' 카테고리의 다른 글
[REDIS] 레디 스 : 목록 또는 정렬 된 세트의 뉴스 피드 밖으로 팬? (0) | 2020.01.03 |
---|---|
[REDIS] 연결 해제 명령은 항상 더 나은 DEL 명령보다? (0) | 2020.01.03 |
[REDIS] 어떻게 StackExchange.Redis 여러 엔드 포인트와 연결을 사용합니까? (0) | 2020.01.03 |
[REDIS] 레디 스를 사용하여 동시 ImageMagick이 요청을 최적화 / PHP-resque (0) | 2020.01.03 |
[REDIS] 단일 서버에서 여러 Laravel 응용 프로그램에 대한 큐의 레디 스를 사용하여 (0) | 2020.01.03 |