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

org.mountcloud.ffmepg.task.bean.FFTask Maven / Gradle / Ivy

package org.mountcloud.ffmepg.task.bean;

import org.mountcloud.ffmepg.operation.FFOperationBase;
import org.mountcloud.ffmepg.task.bean.read.FFTaskReadState;
import org.mountcloud.ffmepg.task.bean.read.FFTaskReadThread;
import org.mountcloud.ffmepg.task.bean.read.FFTaskReadType;
import org.mountcloud.ffmepg.task.context.FFTaskContext;
import org.mountcloud.ffmepg.task.threads.FFThread;
import org.mountcloud.ffmepg.util.FFTerminalCreater;
import org.mountcloud.ffmepg.util.UUIDUtil;

import java.io.IOException;
import java.util.*;

/**
 * 任务父类
 * com.ugirls.ffmepg.task
 * 2018/6/11.
 *
 * @author zhanghaishan
 * @version V1.0
 */
public abstract class FFTask implements FFThread {

    /**
     * 任务id
     */
    private String taskId;

    /**
     * 执行结果的全部内容
     */
    protected StringBuffer result = new StringBuffer("");

    /**
     * 内容操作
     */
    protected T operationBase;

    /**
     * 任务进度
     */
    private FFTaskProgress progress;

    /**
     * 任务命令行
     */
    protected FFTerminalCreater.FFTerminal terminal = null;

    /**
     * 任务创建时间
     */
    private Date createTime;

    /**
     * 读取任务的执行是否完成
     */
    private Map readState = new HashMap<>();

    /**
     * 读取线程
     */
    protected List ffTaskReadThreadList = new ArrayList<>();

    @Override
    public void run() {

        //执行开始前回调
        callExecStart();

        //任务开始
        progress.setState(FFTaskStateEnum.START);

        //执行的命令
        String cmd = operationBase.toString();

        //任务执行状态
        boolean state = true;

        try {
            terminal = FFTerminalCreater.getCreater().getTerminal(cmd);
            //初始化读取线程
            initReadThread();

            //等待执行完毕
            while (!this.checkReadIsEnd()){
                Thread.sleep(500);
            }

            //执行完毕则获取执行状态
            state = this.checkReadState();

        } catch (IOException e) {
            state =false;
            e.printStackTrace();
        } catch (InterruptedException e) {
            state =false;
            e.printStackTrace();
        }

        //设置状态
        if(state){
            progress.setState(FFTaskStateEnum.COMPLETE);
        } else {
            progress.setState(FFTaskStateEnum.FAILED);
        }
        progress.setProgress(100);
        FFTaskContext.getContext().removeTask(this.getTaskId());
        //执行结束回调
        callExecEnd();
    }

    /**
     * 判断是否在读取中
     * @return false 读取中,true 读取完成
     */
    private boolean checkReadIsEnd(){
        for(FFTaskReadState state : readState.values()){
            if(!state.isEnd()){
                return false;
            }
        }
        return true;
    }

    /**
     * 判断读取状态
     * @return false 读取报错,true 读取成功
     */
    private boolean checkReadState(){
        for(FFTaskReadState state : readState.values()){
            if(!state.getState()){
                return false;
            }
        }
        return true;
    }

    /**
     * 初始化读取线程
     */
    private void initReadThread(){

        //创建读取线程,读取error和in
        FFTaskReadThread ffTaskReadErrorThread = new FFTaskReadThread(this, FFTaskReadType.ERROR_IN);
        FFTaskReadThread ffTaskReadThread = new FFTaskReadThread(this, FFTaskReadType.IN);
        readState.put(ffTaskReadErrorThread.getReadType(),new FFTaskReadState());
        readState.put(ffTaskReadThread.getReadType(),new FFTaskReadState());

        //加入线程数组,如果以后需要可以扩展
        ffTaskReadThreadList.add(ffTaskReadErrorThread);
        ffTaskReadThreadList.add(ffTaskReadThread);

        //开启这两个读取线程,此处不优雅,如果有更好的方案请告诉我
        new Thread(ffTaskReadErrorThread).start();
        new Thread(ffTaskReadThread).start();
    }


    /**
     * 传入一行结果
     * @param line 一行日志
     */
    public synchronized void putResultLine(String line){
        result.append(line);
        callRsultLine(line);
    }


    /**
     * 执行开始
     */
    public abstract void callExecStart();

    /**
     * 正确结果行
     * @param line 一行结果
     */
    public abstract void callRsultLine(String line);

    /**
     * 执行结束
     */
    public abstract void callExecEnd();


    /**
     * 任务构造
     * @param operation 操作
     */
    public FFTask(T operation){
        this.operationBase = operation;
        this.taskId = UUIDUtil.getUUIDSimpl();
        this.createTime = new Date();
        this.progress = new FFTaskProgress();
    }

    public FFTask(){
        this.progress = new FFTaskProgress();
    }

    public String getTaskId() {
        return taskId;
    }

    public FFTaskProgress getProgress() {
        return progress;
    }

    public void setProgress(FFTaskProgress progress) {
        this.progress = progress;
    }

    public FFTerminalCreater.FFTerminal getTerminal(){
        return terminal;
    }

    public FFTaskReadState getReadState(FFTaskReadType ffTaskReadType){
        return this.readState.get(ffTaskReadType);
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy