2017-10-04 5 views
0

Ich versuche gerade, Mail mit einer Warteschlange in Laravel 5.4 zu senden, um ein paar Anfragen zu beschleunigen. Aber aus irgendeinem Grund werde ich einfach nicht auflösen.Trouble Dispatching Laravel Queue

Meine Aufgabe sieht wie folgt aus:

<?php 

namespace App\Jobs; 

use Illuminate\Bus\Queueable; 
use Illuminate\Support\Facades\Mail; 
use Illuminate\Queue\SerializesModels; 
use Illuminate\Queue\InteractsWithQueue; 
use Illuminate\Contracts\Queue\ShouldQueue; 
use Illuminate\Foundation\Bus\Dispatchable; 

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

    protected $doer, $does, $user; 

    /** 
    * Create a new job instance. 
    * 
    * @param Podcast $podcast 
    * @return void 
    */ 
    public function __construct($doer, $does, $user) 
    { 
     $this->doer = $doer; 
     $this->does = $does; 
     $this->user = $user; 
    } 

    /** 
    * Execute the job. 
    * 
    * @param AudioProcessor $processor 
    * @return void 
    */ 
    public function handle() 
    { 
     $actions = [ 
      'accepted.invite' => 'accepted your invited.', 
      'accepted.requesting' => 'accepted your request.', 
      'denied.invite' => 'denied your invite.', 
      'denied.requesting' => 'denied your request' 
     ]; 
     Mail::send('emails.notification', [ 
      'doer' => $this->does, 
      'action' => $actions[$this->action] 
     ], function ($m) { 
      $m->from('[email protected]', 'Bigriss'); 

      $m->to("[email protected]", 'Shawn')->subject('New Notification'); 

      echo "SENT"; 
     }); 
    } 
} 

Mit ihm, indem sie in einer anderen Klasse versandt werden:

NotificationEmail::dispatch($doer, $does, $user); 

Beim Hören der Warteschlange, php artisan queue:listen, sobald ich versenden den Auftrag, der Hörer läuft einfach endlos weiter und versucht, die Handle-Funktion aufzulösen. Ich bekomme die Nachricht "SENT", aber die E-Mail wird nie gesendet (wie ich auf meinem E-Mail-Anbieter sehen kann) und die Warteschlange wird nie wirklich entfernt stattdessen, die Anzahl der Versuche geht auf unbestimmte Zeit. Fehle ich hier etwas? Ist das nicht, wozu Warteschlangen gut sind?

+0

Alle Protokollierung oder versuchen/fangen, um sicherzustellen, dass die Handle-Funktion ohne Fehler ausgeführt wurde? –

+0

Ich habe versucht einen Versuch/fangen und es wirft keine Ausnahme. @ JaredChu – Shawn31313

Antwort

0

Sie übergeben Zeichenfolge in Ihre to-Funktion, und Sie verpassen eine Variable in Ihrem Abschluss.

Wenn Sie eine anonyme Funktion haben, müssen Sie zusätzliche Variablen mit use übergeben. Ich sehe keine $user Variable irgendwo in Ihrer Handle-Methode. Es muss als separate Variable übergeben werden, da Sie $this->user nicht verwenden können, um es in den Abschluss zu übergeben.

Gerade jetzt haben Sie

$m->to("$user->email", 'Shawn')->subject('New Notification'); 

was wörtlich interpretiert, dass als String, der sagt $ user-> E-Mail weil Sie nichts in vergangen sind (Randbemerkung:. Es gibt wirklich keinen Grund, Verwenden Sie das hier, speichern Sie das für Inline-Variablen mit Dateipfaden usw. Sie benötigen keine Inline-Variable mit dieser Zeichenkette).

Sie müssten es ändern zu

$user = $this->user; 
Mail::send('emails.notification', [ 
     'doer' => $this->does, 
     'action' => $actions[$this->action] 
    ], function ($m) use ($user) { 
     $m->from('[email protected]', 'Bigriss'); 

     $m->to($user->email, 'Shawn')->subject('New Notification'); 

     echo "SENT"; 
    }); 

Vielleicht möchten Sie mit so etwas wie Laravel Dusk zu debuggen Warteschlange und logging besser, dies zu prüfen, zu kontrollieren, als zu versuchen, nur um „SENT“ in Ihrem Browser anzuzeigen.

Berücksichtigen Sie außerdem die Bereinigung Ihrer Website-Adresse, da Sie den Quellcode veröffentlichen.

+0

Vielen Dank für Ihre Antwort. Entschuldigung für das verwirrende, aber während des Tests habe ich tatsächlich meine echte E-Mail ohne irgendwelche Variablen in der Schließung daher die fehlende Verwendung Aussage, so ist dies das wahre Problem, aber ich war nicht sehr klar darüber. Über den letzten Teil, warum sanitize meine Adresse, wenn dies nichts bösartiger oder Produktionscode ist? – Shawn31313

+0

Was ist Ihre Mail-Konfiguration? Ich würde versuchen, [MailTrap] (https://mailtrap.io/) oder etwas Ähnliches zu starten. Was die Desinfektion angeht, ist es nur eine persönliche Übung, man weiß nie, welche Fragen man in Zukunft haben wird. Ich kann jedoch nur paranoid sein: P – brokekidweb

+0

Ich benutze Mailgun, und es sendet Post völlig in Ordnung, wenn ich nicht nur die Jobs, aber die Anfrage dauert ein bisschen – Shawn31313