MfrSyncJob
App\Jobs\MfrSyncJob
Queueable Background-Job, der MfrController::sync($entity) aufruft. Nutzt Laravel Queues, damit ein voller MFR→Common-Sync nicht den HTTP-Request blockiert.
Signatur
class MfrSyncJob implements ShouldQueue
{
public int $tries = 3;
public function __construct(
public string $entity
) {}
public function handle(): void
{
Log::info($this->entity . ' MFR Sync Job started at ' . now());
app(MfrController::class)->sync($this->entity);
Log::info($this->entity . ' MFR Sync Job finished at ' . now());
}
}
Dispatchen
use App\Jobs\MfrSyncJob;
// On-Demand
MfrSyncJob::dispatch('Companies');
// Mit Verzögerung
MfrSyncJob::dispatch('ServiceRequests')->delay(now()->addMinutes(5));
// Auf einer bestimmten Queue
MfrSyncJob::dispatch('Documents')->onQueue('mfr-sync');
Scheduling
Nutze den Laravel-Scheduler (routes/console.php), um regelmäßig zu syncen:
use App\Jobs\MfrSyncJob;
use Illuminate\Support\Facades\Schedule;
Schedule::job(new MfrSyncJob('Companies'))->hourly();
Schedule::job(new MfrSyncJob('ServiceRequests'))->everyFiveMinutes();
Schedule::job(new MfrSyncJob('TimeEvents'))->everyMinute();
Aktiviere den Scheduler im Server-Cron mit:
* * * * * cd /path-to-app && php artisan schedule:run >> /dev/null 2>&1
Queue-Worker starten
# Dev (siehe composer run dev — startet automatisch queue:listen + server)
php artisan queue:listen
# Production: queue:work mit Supervisor / Horizon
php artisan queue:work --queue=mfr-sync --tries=3 --timeout=300
Tries & Timeouts
-
$tries = 3— bei Fehler bis zu 3 Versuche -
Pro Sync-Lauf können viele tausend Records geladen werden → setze
--timeout=300(oder höher) im Queue-Worker, oder dekommentiere im Job:public int $timeout = 300;
Failed-Jobs
Bei Failure landet der Job in der failed_jobs-Tabelle und kann mit:
php artisan queue:retry all
php artisan queue:flush # alle ausgefallenen Jobs droppen
erneut angestoßen werden.
Ein gescheiterter Sync ist meistens ein Auth-Problem (Basic-Cred falsch) oder ein Timeout auf MFR-Seite. Erste Anlaufstelle:
Log::infoLogs unterstorage/logs/laravel.log.