All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.serphacker.serposcope.task.AbstractTask Maven / Gradle / Ivy

There is a newer version: 2.10.0
Show newest version
/* 
 * Serposcope - SEO rank checker https://serposcope.serphacker.com/
 * 
 * Copyright (c) 2016 SERP Hacker
 * @author Pierre Nogues 
 * @license https://opensource.org/licenses/MIT MIT License
 */
package com.serphacker.serposcope.task;

import com.google.inject.Inject;
import com.serphacker.serposcope.db.base.BaseDB;
import com.serphacker.serposcope.models.base.Group;
import com.serphacker.serposcope.models.base.Run;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public abstract class AbstractTask extends Thread {
    
    private static final Logger LOG = LoggerFactory.getLogger(AbstractTask.class);
    
    volatile boolean abort = false;
    
    @Inject
    protected BaseDB baseDB;
    
    protected long startMilliseconds;
    protected final Run run;
    
    public AbstractTask(Run run) {
        this.run = run;
    }
    
    @Override
    public void run() {
        startMilliseconds = System.currentTimeMillis();
        LOG.info(
            "task started for module {} of day {} ({})", 
            new Object[]{run.getModule(), run.getDay(), (run.getId() == 0 ? "new task": "recheck")}
        );
        if(run.getId() == 0){
            baseDB.run.insert(run);
        } else {
            run.setStatus(Run.Status.RUNNING);
            baseDB.run.updateStatus(run);
            baseDB.run.updateStarted(run);
        }
        
        List groupsIds = baseDB.group.list(run.getModule())
                .stream().map((Group g) -> g.getId()).collect(Collectors.toList());
        
        if(groupsIds.isEmpty()){
            LOG.warn("no group to analyze");
            endRun(Run.Status.DONE_SUCCESS);
            return;
        }
        
        try {
            Run.Status status = doRun();
            endRun(status);
        }catch(Exception ex){
            onCrash(ex);
            LOG.error("Task crashed", ex);
            endRun(Run.Status.DONE_CRASHED);
        }
        LOG.info("task done for module {}", run.getModule());
    }
    
    protected abstract Run.Status doRun() throws Exception;
    protected abstract void onCrash(Exception ex);
    
    protected void endRun(Run.Status status) {
        run.setFinished(run.getStarted().plusSeconds((System.currentTimeMillis() - startMilliseconds) / 1000l));
        baseDB.run.updateFinished(run);
        
        if(abort){
            run.setStatus(Run.Status.DONE_ABORTED);
        } else {
            run.setStatus(status);
        }        
        baseDB.run.updateStatus(run);
    }

    public Run getRun() {
        return run;
    }
    
    public void abort() {
        abort = true;
    }
    
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy