originalShipment = $originalShipment; $this->options = $options; // Set queue name based on priority if (isset($options['priority']) && $options['priority'] === 'high') { $this->onQueue('high-priority'); } else { $this->onQueue('dhl-returns'); } } /** * Execute the job. */ public function handle(): void { try { Log::info('[DHL Queue] Starting return label creation job', [ 'original_shipment_id' => $this->originalShipment->id, 'original_shipment_number' => $this->originalShipment->shipment_number, 'attempt' => $this->attempts(), ]); $dhlService = new DhlApiService(); // Create the return label $returnShipment = $dhlService->createReturnLabel( $this->originalShipment, $this->options ); Log::info('[DHL Queue] Return label created successfully', [ 'original_shipment_id' => $this->originalShipment->id, 'return_shipment_id' => $returnShipment->id, 'return_shipment_number' => $returnShipment->shipment_number, ]); // Trigger follow-up actions if specified if (isset($this->options['auto_track']) && $this->options['auto_track']) { \App\Jobs\TrackShipmentJob::dispatch($returnShipment)->delay(now()->addMinutes(5)); } } catch (Exception $e) { Log::error('[DHL Queue] Return label creation failed', [ 'original_shipment_id' => $this->originalShipment->id, 'error' => $e->getMessage(), 'attempt' => $this->attempts(), 'max_tries' => $this->tries, ]); // If this is the final attempt, mark as permanently failed if ($this->attempts() >= $this->tries) { Log::error('[DHL Queue] Return label creation permanently failed', [ 'original_shipment_id' => $this->originalShipment->id, 'error' => $e->getMessage(), ]); } throw $e; // Re-throw to trigger retry mechanism } } /** * Handle a job failure. * * @param Exception $exception */ public function failed(Exception $exception): void { Log::error('[DHL Queue] CreateReturnLabelJob permanently failed', [ 'original_shipment_id' => $this->originalShipment->id, 'original_shipment_number' => $this->originalShipment->shipment_number, 'error' => $exception->getMessage(), 'trace' => $exception->getTraceAsString(), ]); // You could implement additional failure handling here: // - Send notification to admin // - Create manual task for staff to handle return label creation // - Update original shipment to mark return label creation failed } /** * Determine the time at which the job should timeout. * * @return \DateTime */ public function retryUntil() { return now()->addHours(2); } }