executeJob method

Future<void> executeJob(
  1. JobContext context
)

Execute job with full lifecycle

Implementation

Future<void> executeJob(JobContext context) async {
  final startTime = DateTime.now();

  try {
    // Update status
    context.status = JobStatus.processing;
    context.attempts++;

    // Track metrics
    if (metrics != null) {
      metrics!.jobStarted();
    }

    // Execute through middleware pipeline or directly
    if (middleware != null && config.useMiddleware) {
      final middlewareContext = QueueJobContext(
        job: context.job,
        metadata: context.metadata,
      );
      await middleware!.execute(middlewareContext);

      if (middlewareContext.hasError) {
        throw middlewareContext.error;
      }
    } else {
      // Apply timeout if configured
      final timeout = context.job.timeout ?? config.defaultJobTimeout;
      if (timeout != null) {
        await context.job.handle().timeout(timeout);
      } else {
        await context.job.handle();
      }
    }

    // Job succeeded
    context.status = JobStatus.completed;

    if (metrics != null) {
      final processingTime = DateTime.now().difference(startTime);
      metrics!.jobCompleted(
        context.job.runtimeType.toString(),
        processingTime,
      );
    }

    await onJobCompleted(context);
  } on TimeoutException catch (e, stack) {
    context.status = JobStatus.timedOut;
    context.error = e;
    context.stackTrace = stack;

    if (metrics != null) {
      metrics!.jobTimedOut(context.job.runtimeType.toString());
    }

    await handleJobFailure(context);
  } catch (e, stack) {
    context.status = JobStatus.failed;
    context.error = e;
    context.stackTrace = stack;

    if (metrics != null) {
      metrics!.jobFailed(context.job.runtimeType.toString());
    }

    await handleJobFailure(context);
  }
}