executeJob method
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);
}
}