2, // 持久化消息 ]; /** * Exchange 配置 */ protected string $exchange = 'errors.exchange'; /** * Routing Key 配置 */ protected string|array $routingKey = 'error'; /** * 构造错误消息 * * @param AMQPMessage $originalMessage 原始失败的消息 * @param Throwable $error 错误异常 * @param int $retryCount 重试次数 */ public function __construct( AMQPMessage $originalMessage, Throwable $error, int $retryCount ) { $this->payload = $this->buildErrorMessage($originalMessage, $error, $retryCount); } /** * 构建错误消息格式 * * @param AMQPMessage $originalMessage 原始消息 * @param Throwable $error 错误信息 * @param int $retryCount 重试次数 * @return array */ protected function buildErrorMessage( AMQPMessage $originalMessage, Throwable $error, int $retryCount ): array { $originalData = json_decode($originalMessage->getBody(), true); return [ 'error_id' => $this->generateErrorId(), 'original_message' => $originalData, 'error' => [ 'type' => get_class($error), 'message' => $error->getMessage(), 'code' => $error->getCode(), 'file' => $error->getFile(), 'line' => $error->getLine(), 'trace' => $error->getTraceAsString(), 'timestamp' => date('c'), ], 'metadata' => [ 'platform' => $originalData['platform'] ?? 'unknown', 'platform_id' => $originalData['meta']['platform_id'] ?? null, 'company_id' => $originalData['meta']['company_id'] ?? null, 'store_id' => $originalData['meta']['store_id'] ?? null, 'data_type' => $originalData['data_type'] ?? 'unknown', 'message_id' => $originalData['message_id'] ?? null, 'failed_at' => date('c'), 'retry_count' => $retryCount, ], ]; } /** * 生成错误ID * * 格式: err_{timestamp}_{random} * * @return string */ protected function generateErrorId(): string { return uniqid('err_', true); } }