diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskBase.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskBase.java index 0b8d31e..338ce39 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskBase.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskBase.java @@ -1,7 +1,9 @@ package com.my.graphiteDigesterBg.diframe; +import com.my.graphiteDigesterBg.diframe.model.DiMdbTaskExecution; import com.my.graphiteDigesterBg.diframe.model.DiMdbUser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.Map; abstract public class DiTaskBase implements DiTask { // logger public static final Logger LOG = LoggerFactory.getLogger(DiTaskExecutor.class); @@ -15,23 +17,61 @@ abstract public class DiTaskBase implements DiTask { private Boolean isRequestTaskStop = false; // user private DiMdbUser user; + // execution + private final DiMdbTaskExecution execution; // constructor public DiTaskBase() { this.uuid = java.util.UUID.randomUUID().toString(); this.status = TaskStatus.NEW; this.user = null; + + var tmpExecution = new DiMdbTaskExecution(); + tmpExecution.uuid = this.uuid; + tmpExecution.status = "NEW"; + tmpExecution.runtimeStatus = ""; + tmpExecution.message = ""; + tmpExecution.createdAt = (int)(System.currentTimeMillis() / 1000); + tmpExecution.userId = 0; + tmpExecution.name = ""; + tmpExecution.save(); + // why ? 遇到这个问题的时候,作者10天前才更新, 再等等吧 ~~~ + // @link https://discourse.hibernate.org/t/not-implemented-by-sqlite-jdbc-driver/8435/7 + this.execution = DiActiveRecord.findOne(DiMdbTaskExecution.class, Map.of("uuid", this.uuid)); + } + + @Override + public void init() { + Task task = this.getClass().getAnnotation(Task.class); + this.execution.name = task.name(); + this.execution.userId = null == this.user ? 0 :this.user.id; + this.execution.save(); } @Override public void setStatus(TaskStatus status) { this.status = status; + this.execution.status = status.toString(); + this.execution.save(); + LOG.info("[Task #{}] Status => {}", this.getUUID(), this.getStatus()); if ( TaskStatus.READY.equals(this.getStatus()) ) { this.getDevice().getTaskManager().getExecutor().notifyTaskReady(); } } + // set runtime status + protected void setRuntimeStatus( String status ) { + this.execution.runtimeStatus = status; + this.execution.save(); + } + + // clear runtime status + protected void clearRuntimeStatus() { + this.execution.runtimeStatus = ""; + this.execution.save(); + } + @Override public DiDevice getDevice() { return this.device; @@ -65,9 +105,18 @@ abstract public class DiTaskBase implements DiTask { // run @Override public void run() { - this.status = TaskStatus.FINISHED; + try { + this.execute(); + } catch ( Exception e ) { + this.execution.status = "ERROR"; + this.execution.message = e.getMessage(); + this.execution.save(); + } } + // execute task - implement this method in subclass + abstract protected void execute(); + @Override public void stop() { this.isRequestTaskStop = true;