in src/main/java/org/apache/sling/event/impl/jobs/JobConsumerManager.java [509:552]
public JobExecutionResult process(final Job job, final JobExecutionContext context) {
final JobConsumer.AsyncHandler asyncHandler =
new JobConsumer.AsyncHandler() {
final Object asyncLock = new Object();
final AtomicBoolean asyncDone = new AtomicBoolean(false);
private void check(final JobExecutionResult result) {
synchronized ( asyncLock ) {
if ( !asyncDone.get() ) {
asyncDone.set(true);
context.asyncProcessingFinished(result);
} else {
throw new IllegalStateException("Job is already marked as processed");
}
}
}
@Override
public void ok() {
this.check(context.result().succeeded());
}
@Override
public void failed() {
this.check(context.result().failed());
}
@Override
public void cancel() {
this.check(context.result().cancelled());
}
};
((JobImpl)job).setProperty(JobConsumer.PROPERTY_JOB_ASYNC_HANDLER, asyncHandler);
final JobConsumer.JobResult result = this.consumer.process(job);
if ( result == JobResult.ASYNC ) {
return null;
} else if ( result == JobResult.FAILED) {
return context.result().failed();
} else if ( result == JobResult.OK) {
return context.result().succeeded();
}
return context.result().cancelled();
}