sending emails with spatie laravel rate limited job middleware and laravel horizon cause multiple duplicate received emails

Viewed 129

Horizon configuration:

'production' => [
        'supervisor-1' => [
            'connection' => 'redis',
            'queue' => [
                'weekly_survey',
                'notification',
                'api',
                'default'
            ],
            'balance' => 'auto',
            'processes' => 6,
            'tries' => 15,
            'timeout' => 90
        ],
    ]

Here's my Trial Ends Job code which has been called inside ProcessTimeZoneSchedule job.

<?php

namespace App\Jobs;

use App\ActivityLogger;
use App\Mail\SendTrialEndsMail;
use App\User;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Redis;
use Spatie\RateLimitedMiddleware\RateLimited;

class TrialEndsJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $user;
/**
 * Create a new job instance.
 *
 * @return void
 */
public function __construct($user)
{
    $this->user = $user;
}
/**
 * The maximum number of unhandled exceptions to allow before failing.
 *
 * @var int
 */
public $maxExceptions = 10;

/**
 * The number of seconds to wait before retrying the job.
 *
 * @var int
 */
public $backoff = 5;

public function handle()
{
    $user = User::find($this->user->id);

    $user->freeze_account        = 1;
    $user->freeze_account_reason = 'Your account is frozen. Please update your credit card details. After your payment was successful, you regain access to your account. Questions? Please contact ' . env('MAIL_SUPPORT') . '.';
    $user->increment('email_notification_sent');
    $user->increment('emails_sent');

    $user->trial_ends_sent = true;
    $user->save();
    (new ActivityLogger())->recordActivity($user->id, 'trial ended', null);

    if ($this->user->language) {
        Mail::to($this->user)->locale($this->user->language)->send(new SendTrialEndsMail($this->user));
    } else {
        Mail::to($this->user)->send(new SendTrialEndsMail($this->user));
    }
}

public function middleware()
{
    $rateLimitedMiddleware = (new RateLimited())
        ->allow(50)
        ->everySeconds(10)
        ->releaseAfterSeconds(5);

    return [$rateLimitedMiddleware];
}

ProcessTimeZoneSchedule job

class ProcessTimezoneSchedules implements ShouldQueue
{
  use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

  public function handle(TimezoneRepository $timezoneRepository)
  {
     // get user's unique timezone
     $timezones = $timezoneRepository->getUniqueTimezones();
     foreach ($timezones as $timezone) {
        // set current timezone
        $date = Carbon::now($timezone);
        
        // trial ends at every 23:00
        if ($date->hour == 23 && $date->minute == 0) {
            $this->trialEnds($timezone);
        }
     }

  private function trialEnds($timezone)
  {
    $users = User::whereDate('trial_ends_at',  Carbon::parse(now() , $timezone)- 
     >setTimezone('UTC')  )->where('trial_ends_sent', false)->get();
    foreach ($users as $user) {
        if (!$user->subscribed('default')) {
            try {
                TrialEndsJob::dispatch($user)->onQueue('notification');
            } catch (\Exception $exception) {
                report($exception);
            }
        }
    }
   }
  }

This is how I call it in Kernel.php

$schedule->job(new ProcessTimezoneSchedules())->everyMinute();

Here's an actual email result actual email result I can't figure out why it received multiple emails and the emails content have updated template and old templates. It means the styling for every emails received has both the updated one and the outdated. Because I change style elements from classing to inline. Spatie package I'm using spatie laravel rate limited job middleware

0 Answers
Related