2016-05-19 6 views
3

Ich entwickle API auf Laravel für mobile Anwendung.Rückgabedaten von Laravel Jobs

Methoden werden Anfragen an anderen APIs machen, kombinieren und Filterdaten, seine Struktur zu ändern usw.

Eine der Anforderungen an App ist nicht mehr als 30 Sekunden zu reagieren oder nicht reagieren . Also, ich muss Anfragen so oft wiederholen wie ich Zeit habe. Ich versuche, dass mit Laravel Warteschlangen zu realisieren, und zur Zeit so etwas habe in meinem Job Klasse:

private $apiActionName; 

public function __construct($apiActionName) 
{ 
    $this->apiActionName = $apiActionName; 
} 

public function handle(SomeService $someService) 
{ 
    return $someService->{$this->apiActionName}(); 
} 

Und diese Aktion Code in Controller:

public function someAction() 
{ 
    $data = $this->dispatch(new MyJob($apiActionName)); 
    return response()->json($data); 
} 

Ja, ich weiß, es ist eine schlechte Idee, Rückgabewert von Job, aber erwarte, dass es möglich ist. $ this-> dispatch() gibt nur die Job-ID in der Warteschlange zurück, nicht das Ergebnis der Handle Methode.

TL; DR: Wie kann ich Daten aus dem Job in der Warteschlange zurückgeben, ohne sie irgendwo zu speichern, und selbst wenn mehrere Versuche in der Warteschlange vorhanden sind? Vielleicht kennt jemand andere Möglichkeiten, wenn Jobs dafür nicht geeignet sind. Jeder Rat wird geschätzt.

Vielen Dank im Voraus!

Antwort

1

Sie geben Daten in Ihrer Job-Klasse zurück, weisen einem Dispatcher jedoch $ Daten zu - beachten Sie, dass die Methode dispatch() nicht Teil Ihrer Job-Klasse ist.

Man könnte so etwas wie diese versuchen, unter der Annahme, dass Ihre Aufträge laufen synchron:

private $apiActionName; 
private $response; 

public function __construct($apiActionName) 
{ 
    $this->apiActionName = $apiActionName; 
} 

public function handle(SomeService $someService) 
{ 
    $this->response = $someService->{$this->apiActionName}(); 
} 

public function getResponse() 
{ 
    return $this->response; 
} 

Und dann in Ihrem Controller:

public function someAction() 
{ 
    $job = new MyJob($apiActionName); 
    $data = $this->dispatch($job); 
    return response()->json($job->getResponse()); 
} 

Offensichtlich wird dies nicht funktionieren, wenn Sie ASYNC bewegen Modus und Warteschlangen - die Antwort ist noch nicht vorhanden, wenn Sie getResponse() aufrufen. Aber das ist der ganze Zweck von asynchronen Jobs :)

+0

Vielen Dank für Ihre Antwort! Das Problem, dass ich es im asynchronen Modus ausführen muss, weil sonst Job im Falle eines Fehlers nicht wiederholt wird. Ich habe versucht, Ihre Empfehlung mit Getter zu folgen, und überprüfen Sie dann getResponse() in einer Schleife, aber es funktioniert nicht (Wiederholungen haben andere IDs?). Übrigens ist es möglich, Wert von nicht in die Warteschlange eingereihten Jobs ohne Getter zurückzugeben: $ data = $ this-> dispatchNow ($ job); – Bushikot

+2

Wird es im asynchronen Modus nicht möglich sein, einen Wert per Definition zurückzugeben - weil es später im asynchronen Modus ausgeführt wird. Daher muss Ihr Job das Ergebnis irgendwo speichern, und ein Client/Controller muss erneut danach fragen, entweder per Polling oder Echtzeit-Streaming (websockets, pubsub). In jedem Fall können Sie nicht einfach ein Ergebnis aus einem asynchronen Job zurückgeben –

Verwandte Themen