* enqueued to the book-keeping data structure.
*/
class JobEntry<T> {
-
+ private final SettableFuture<T> resultFuture = SettableFuture.create();
+ private @Nullable final Callable<ListenableFuture<T>> mainWorker;
private final String key;
- private volatile @Nullable Callable<ListenableFuture<T>> mainWorker;
- private volatile SettableFuture<T> resultFuture;
JobEntry(String key, Callable<ListenableFuture<T>> mainWorker) {
this.key = key;
this.mainWorker = mainWorker;
- resultFuture = SettableFuture.create();
}
- public String getKey() {
+ String getKey() {
return key;
}
- @Nullable public Callable<ListenableFuture<T>> getMainWorker() {
+ @Nullable Callable<ListenableFuture<T>> getMainWorker() {
return mainWorker;
}
- public void setMainWorker(@Nullable Callable<ListenableFuture<T>> mainWorker) {
- this.mainWorker = mainWorker;
- }
-
- public ListenableFuture<T> getResultFuture() {
+ ListenableFuture<T> getResultFuture() {
return resultFuture;
}
- public void setResultFuture(@Nullable T result) {
- this.resultFuture.set(result);
+ void setResult(@Nullable T result) {
+ resultFuture.set(result);
}
+ void setFailure(Throwable failure) {
+ resultFuture.setException(failure);
+ }
}
final Callable<ListenableFuture<T>> mainWorker = job.getMainWorker();
if (mainWorker == null) {
LOG.error("Unexpected no (null) main worker on job: {}", job);
- job.setResultFuture(null);
+ job.setResult(null);
return;
}
future = mainWorker.call();
} catch (Exception e) {
LOG.error("Direct Exception (not failed Future) when executing job, won't even retry: {}", job, e);
- job.setResultFuture(null);
+ job.setResult(null);
return;
}
@Override
public void onSuccess(final T result) {
LOG.trace("Job completed successfully: {}", job.getKey());
- job.setResultFuture(result);
+ job.setResult(result);
}
@Override
public void onFailure(final Throwable cause) {
LOG.error("Job {} failed", job.getKey(), cause);
+ job.setFailure(cause);
}
}, MoreExecutors.directExecutor());