복붙노트

[REDIS] Laravel 또는 레디 스에서 작업을 대기 취소하는 방법

REDIS

Laravel 또는 레디 스에서 작업을 대기 취소하는 방법

내 레디 스 내가 어떤 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. ==============================

    1.모든 대기 작업을 제거 :

    모든 대기 작업을 제거 :

    Redis::command('flushdb');
    
  2. ==============================

    2.쉽게합니다.

    쉽게합니다.

    나중에 옵션으로 이메일을 보내하지 마십시오. 당신은 나중에 옵션으로 작업을 파견해야하며,이 작업은 이메일을 보낼 책임이 있습니다.

    이 작업 내부 전에 시간이 지불 한 이메일 주소-전송을 확인, 이메일을 보낼 수 있습니다. 올바른 경우, 이메일을 보낼 경우, true를 반환하고 이메일이 전송되지 않고 작업이 완료됩니다.

  3. ==============================

    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. ==============================

    4.어쩌면 대신을 취소 당신은 실제로 필자는 당신이 부를 수있는 경우 기본적으로 인터페이스에서 모든 레디 스 명령을 호출 할 수 있습니다 레디 스와 상호 작용 레디 스와 Laravel 공식 문서에서 명령을 잊지에 대한 공식 문서에서 읽은 내용에서의 레디 스에서 제거 할 수 있습니다 명령을 잊지 실제로이 경우에 나는 그것이 내가 당신이 "취소"달성 할 수 있다고 생각 당신이 당신의 이미지 DEL 1517797158에있는 그 수 있다고 생각 NODE_ID를 전달합니다.

    어쩌면 대신을 취소 당신은 실제로 필자는 당신이 부를 수있는 경우 기본적으로 인터페이스에서 모든 레디 스 명령을 호출 할 수 있습니다 레디 스와 상호 작용 레디 스와 Laravel 공식 문서에서 명령을 잊지에 대한 공식 문서에서 읽은 내용에서의 레디 스에서 제거 할 수 있습니다 명령을 잊지 실제로이 경우에 나는 그것이 내가 당신이 "취소"달성 할 수 있다고 생각 당신이 당신의 이미지 DEL 1517797158에있는 그 수 있다고 생각 NODE_ID를 전달합니다.

  5. ==============================

    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. ==============================

    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. ==============================

    7.내가이 명령을 실행 레디 스 - CLI를 사용하여 :

    내가이 명령을 실행 레디 스 - CLI를 사용하여 :

    KEYS *queue*
    

    레디 스 인스턴스 개최 대기 작업에, 다음 어떤 키가 응답 나타났다 삭제

    DEL queues:default queues:default:reserved
    
  8. from https://stackoverflow.com/questions/48255735/how-to-cancel-queued-job-in-laravel-or-redis by cc-by-sa and MIT license