2016-05-13 9 views
0

Ich habe eine funktionierende RabbitMQ-Server, aber ich bin auf eine Sache stecken.RabbitMQ - Infintie-Schleife beim Senden von Aufgaben

Ich habe eine MySQL-Tabelle, wo jetzt eine Zeile ist. Aber mit jeder verarbeiteten Zeile gibt es neue Zeilen (etwa 20 neue Zeilen mit einer Zeile verarbeitet).

Wie schreibe ich einen Produzenten, der unendlich läuft und Zeile für Zeile stundenlang abarbeitet, bis ich ihn aufhalte?

Ich denke, Produzent wird bei Timeout sterben, oder?

Und wie schreibe ich während Bedingung? Weil, wenn ich etwas wie dieses versuchen werde, beeinflußt es nicht die Reihen, die in der Prozeßzeit hinzugefügt werden.

$sql = "SELECT columns FROM `table`"; 
$result = mysqli_query($con,$sql); 

while($row = mysqli_fetch_assoc($result)) { 
} 

Ich weiß, dass eine andere Lösung Cron-Job ist, aber es ist für mich nicht ideal, weil ich es auf Windows und Task-Scheduler erlaubt nur 5 Minuten wiederholen renne. Nicht weniger.

Vielen Dank im Voraus.

Antwort

0

Wenn jede Verarbeitung einer Zeile mehr Zeilen erzeugt, wird Ihr Algorithmus niemals beendet. Ich nehme an, du solltest eine Abbruchbedingung haben.

Auf einem Messaging-System sollten Sie Produzenten und Verbraucher haben. Der Hersteller sendet explizit Nachrichten an RabbitMQ und Sie sollten nur die Konsumenten konfigurieren, die automatisch angerufen werden, wenn eine Nachricht zur Verarbeitung bereit ist.

In Ihrer Nachricht sollten Sie die ID der zu verarbeitenden Zeile haben. Ihr Kunde verarbeitet diese Zeile nur, erstellt möglicherweise neue Zeilen, sendet Nachrichten für neue Zeilen und beendet sie. Der Consumer wird für neue Nachrichten aufgerufen.

Ihre globale Verarbeitung wird beendet, wenn keine weiteren Nachrichten zu verarbeiten sind.

Die Art der Nachrichtenverwaltung ermöglicht einen Lastausgleich zwischen mehreren Servern, wenn viele Nachrichten in kurzer Zeit erstellt werden.

Verwandte Themen