import java.util.concurrent.TimeUnit;
import jalview.bin.Cache;
+import jalview.bin.Console;
import jalview.util.ArrayUtils;
+import jalview.util.MathUtils;
import jalview.ws.params.ArgumentI;
import jalview.ws2.actions.api.TaskEventListener;
import jalview.ws2.actions.api.TaskI;
*/
public abstract class AbstractPollableTask<T extends BaseJob, R> implements TaskI<R>
{
+ private final long uid = MathUtils.getUID();
+
protected final WebServiceClientI client;
protected final List<ArgumentI> args;
private final TaskEventSupport<R> eventHandler;
- protected JobStatus taskStatus = null;
+ protected JobStatus taskStatus = JobStatus.CREATED;
private Future<?> future = null;
this.eventHandler = new TaskEventSupport<R>(this, eventListener);
}
+ public long getUid()
+ {
+ return uid;
+ }
+
/**
* Start the task using provided scheduled executor service. It creates a
* polling loop running at set intervals.
*/
private void updateGlobalStatus()
{
- JobStatus newStatus = taskStatus;
- int currentPrecedence = ArrayUtils.indexOf(statusPrecedence, newStatus);
+ int precedence = -1;
for (BaseJob job : jobs)
{
JobStatus status = job.getStatus();
- int jobPrecedence = ArrayUtils.indexOf(statusPrecedence, status);
- if (currentPrecedence < jobPrecedence)
- {
- currentPrecedence = jobPrecedence;
- newStatus = status;
- }
+ int jobPrecedence = ArrayUtils.indexOf(JobStatus.statusPrecedence, status);
+ if (precedence < jobPrecedence)
+ precedence = jobPrecedence;
+ }
+ if (precedence >= 0)
+ {
+ setStatus(JobStatus.statusPrecedence[precedence]);
}
- setStatus(newStatus);
}
- /**
- * A precedence order of job statuses used to compute the overall task status.
- */
- private static JobStatus[] statusPrecedence = {
- JobStatus.INVALID, // all must be invalid for task to be invalid
- JobStatus.COMPLETED, // all but invalid must be completed for task to be
- // completed
- JobStatus.UNKNOWN, // unknown prevents successful completion but not
- // running or failure
- JobStatus.READY,
- JobStatus.SUBMITTED,
- JobStatus.QUEUED,
- JobStatus.RUNNING,
- JobStatus.CANCELLED, // if any is terminated unsuccessfully, the task is
- // failed
- JobStatus.FAILED,
- JobStatus.SERVER_ERROR
- };
-
@Override
public void cancel()
{
job.setStatus(JobStatus.CANCELLED);
} catch (IOException e)
{
- Cache.log.error(format("failed to cancel job %s", job.getServerJob()), e);
+ Console.error(format("failed to cancel job %s", job.getServerJob()), e);
}
}
}
{
return result;
}
+
+ @Override
+ public String toString()
+ {
+ var status = taskStatus != null ? taskStatus.name() : "UNSET";
+ return String.format("%s(%x, %s)", getClass().getSimpleName(), uid, status);
+ }
}