©Sergey Emelyanov 2025 | Alle Rechte vorbehalten
Willkommen zum nächsten Teil unseres Kurses „Asynchrones Vtiger mit RabbitMQ“. Bisher haben wir Daten von Vtiger an externe Dienste gesendet. Jetzt kehren wir die Richtung um: Wir bringen Vtiger bei, Nachrichten aus RabbitMQ-Queues zu lesen und auf Events von externen Apps zu reagieren – etwa um Kontakte zu erstellen oder zu aktualisieren.
Das passive Abfragen von Queues (z. B. via Cron-Jobs) ist ineffizient. Stattdessen brauchen wir einen kontinuierlichen Listener, der sofort reagiert, sobald eine Nachricht eintrifft. Hier kommt RabbitMQs basic.consume
ins Spiel.
basic.get
: Polling-Methode – fragt regelmäßig bei RabbitMQ nach neuen Nachrichten (ressourcenintensiv).basic.consume
: Push-Methode – RabbitMQ sendet Nachrichten automatisch, sobald der Consumer verfügbar ist (effizienter).// vtiger/modules/Contacts/RabbitMQConsumer.php
require_once __DIR__ . '/../../vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
$connection = new AMQPStreamConnection('localhost', 5672, 'user', 'pass');
$channel = $connection->channel();
// Queue deklarieren (dauerhaft)
$channel->queue_declare('external_contacts', false, true, false, false);
$callback = function ($msg) {
try {
$data = json_decode($msg->body, true);
// Kontakt erstellen/aktualisieren
$contact = Vtiger_Record_Model::getCleanInstance('Contacts');
$contact->set('firstname', $data['vorname']);
$contact->set('lastname', $data['nachname']);
$contact->set('phone', $data['telefon']);
$contact->save();
$msg->ack(); // Bestätigung an RabbitMQ
} catch (Exception $e) {
$msg->nack(); // Bei Fehler: Nachricht zurück in die Queue
error_log("Fehler: " . $e->getMessage());
}
};
$channel->basic_consume('external_contacts', '', false, false, false, false, $callback);
while ($channel->is_consuming()) {
$channel->wait();
}
$channel->close();
$connection->close();
Erstellen Sie eine Supervisor-Konfigurationsdatei (/etc/supervisor/conf.d/vtiger_consumer.conf
):
[program:vtiger_consumer]
command=php /pfad/zur/vtiger/modules/Contacts/RabbitMQConsumer.php
autostart=true
autorestart=true
stderr_logfile=/var/log/vtiger_consumer.err.log
stdout_logfile=/var/log/vtiger_consumer.out.log
Starten Sie den Dienst:
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start vtiger_consumer
---
Best Practices
1. Idempotenz: Stellen Sie sicher, dass wiederholte Nachrichten keine Duplikate erzeugen (z. B. über `message_id`-Prüfung).
2. Fehlerbehandlung:
- Nach 3 Fehlversuchen → Nachricht in Dead-Letter-Queue verschieben.
- Loggen Sie Fehler mit Kontext (z. B. `$data`).
3. Sicherheit:
- Nutzen Sie SSL/TLS für die RabbitMQ-Verbindung.
- Validieren Sie Eingabedaten (z. B. Telefonnummernformat).
---
Praxisbeispiel: Kontakt-Synchronisation
Szenario: Eine externe App erstellt einen Kontakt → sendet Nachricht an RabbitMQ → Vtiger verarbeitet sie sofort.
Nachrichtenformat: {
"message_id": "a1b2c3",
"event_type": "contact_created",
"data": {
"vorname": "Anna",
"nachname": "Müller",
"telefon": "+49123456789"
}
}
durable=true
, um Nachrichten bei Neustarts zu erhalten.$msg->ack()
).Im Video zeige ich:
Fragen? Stellen Sie sie in den Kommentaren – ich unterstütze Sie gern! 🚀
„Mit RabbitMQ wird Vtiger zum aufmerksamen Zuhörer – immer bereit, Nachrichten aus der Außenwelt zu empfangen und blitzschnell zu reagieren.“
©Sergey Emelyanov 2025 | Alle Rechte vorbehalten