|
|
@ -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; |
|
|
|