最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PowerJob的AbstractScriptProcessor實(shí)現(xiàn)類工作流程源碼解讀

 更新時(shí)間:2024年01月04日 09:39:51   作者:codecraft  
這篇文章主要為大家介紹了PowerJob的AbstractScriptProcessor源碼流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

本文主要研究一下PowerJob的AbstractScriptProcessor

AbstractScriptProcessor

tech/powerjob/official/processors/impl/script/AbstractScriptProcessor.java

@Slf4j
public abstract class AbstractScriptProcessor extends CommonBasicProcessor {
    private static final ForkJoinPool POOL = new ForkJoinPool(4 * Runtime.getRuntime().availableProcessors());
    private static final Set<String> DOWNLOAD_PROTOCOL = Sets.newHashSet("http", "https", "ftp");
    protected static final String SH_SHELL = "/bin/sh";
    protected static final String CMD_SHELL = "cmd.exe";
    private static final String WORKER_DIR = PowerFileUtils.workspace() + "/official_script_processor/";
    @Override
    protected ProcessResult process0(TaskContext context) throws Exception {
        OmsLogger omsLogger = context.getOmsLogger();
        String scriptParams = CommonUtils.parseParams(context);
        omsLogger.info("[SYSTEM] ScriptProcessor start to process, params: {}", scriptParams);
        if (scriptParams == null) {
            String message = "[SYSTEM] ScriptParams is null, please check jobParam configuration.";
            omsLogger.warn(message);
            return new ProcessResult(false, message);
        }
        String scriptPath = prepareScriptFile(context.getInstanceId(), scriptParams);
        omsLogger.info("[SYSTEM] Generate executable file successfully, path: {}", scriptPath);
        if (SystemUtils.IS_OS_WINDOWS) {
            if (StringUtils.equals(getRunCommand(), SH_SHELL)) {
                String message = String.format("[SYSTEM] Current OS is %s where shell scripts cannot run.", SystemUtils.OS_NAME);
                omsLogger.warn(message);
                return new ProcessResult(false, message);
            }
        }
        // 授權(quán)
        if  ( !SystemUtils.IS_OS_WINDOWS) {
            ProcessBuilder chmodPb = new ProcessBuilder("/bin/chmod", "755", scriptPath);
            // 等待返回,這里不可能導(dǎo)致死鎖(shell產(chǎn)生大量數(shù)據(jù)可能導(dǎo)致死鎖)
            chmodPb.start().waitFor();
            omsLogger.info("[SYSTEM] chmod 755 authorization complete, ready to start execution~");
        }
        // 2. 執(zhí)行目標(biāo)腳本
        ProcessBuilder pb = StringUtils.equals(getRunCommand(), CMD_SHELL) ?
                new ProcessBuilder(getRunCommand(), "/c", scriptPath)
                : new ProcessBuilder(getRunCommand(), scriptPath);
        Process process = pb.start();
        StringBuilder inputBuilder = new StringBuilder();
        StringBuilder errorBuilder = new StringBuilder();
        boolean success = true;
        String result;
        final Charset charset = getCharset();
        try (InputStream is = process.getInputStream(); InputStream es = process.getErrorStream()) {
            POOL.execute(() -> copyStream(is, inputBuilder, omsLogger, charset));
            POOL.execute(() -> copyStream(es, errorBuilder, omsLogger, charset));
            success = process.waitFor() == 0;
        } catch (InterruptedException ie) {
            omsLogger.info("[SYSTEM] ScriptProcessor has been interrupted");
        } finally {
            result = String.format("[INPUT]: %s;[ERROR]: %s", inputBuilder.toString(), errorBuilder.toString());
        }
        return new ProcessResult(success, result);
    }
    /**
     * 生成腳本名稱
     * @param instanceId id of instance
     * @return 文件名稱
     */
    protected abstract String getScriptName(Long instanceId);
    /**
     * 獲取運(yùn)行命令(eg,shell返回 /bin/sh)
     * @return 執(zhí)行腳本的命令
     */
    protected abstract String getRunCommand();
    //......
}
AbstractScriptProcessor繼承了CommonBasicProcessor,它定義了一個(gè)parallelism為4*Runtime.getRuntime().availableProcessors()的ForkJoinPool;其process0方法先讀取scriptParams,然后執(zhí)行prepareScriptFile獲取scriptPath,接著使用chmod變更script權(quán)限為755,然后通過getRunCommand獲取命令,接著往pool提交copyStream,等待process返回

prepareScriptFile

private String prepareScriptFile(Long instanceId, String processorInfo) throws IOException {
        String scriptPath = WORKER_DIR + getScriptName(instanceId);
        File script = new File(scriptPath);
        if (script.exists()) {
            return scriptPath;
        }
        File dir = new File(script.getParent());
        boolean success = dir.mkdirs();
        success = script.createNewFile();
        if (!success) {
            throw new RuntimeException("create script file failed");
        }

        // 如果是下載鏈接,則從網(wǎng)絡(luò)獲取
        for (String protocol : DOWNLOAD_PROTOCOL) {
            if (processorInfo.startsWith(protocol)) {
                FileUtils.copyURLToFile(new URL(processorInfo), script, 5000, 300000);
                return scriptPath;
            }
        }

        final Charset charset = getCharset();

        if(charset != null)
        {
            try (Writer fstream = new OutputStreamWriter(Files.newOutputStream(script.toPath()), charset); BufferedWriter out = new BufferedWriter(fstream)) {
                out.write(processorInfo);
                out.flush();
            }
        }
        else {
            try (FileWriter fw = new FileWriter(script); BufferedWriter bw = new BufferedWriter(fw)) {
                bw.write(processorInfo);
                bw.flush();
            }
        }
        return scriptPath;
    }
prepareScriptFile先通過getScriptName獲取scriptPath,如果是http、https、ftp鏈接則通過FileUtils.copyURLToFile下載,否則把scriptParams寫入到scriptPath

copyStream

private static void copyStream(InputStream is, StringBuilder sb, OmsLogger omsLogger, Charset charset) {
        String line;
        try (BufferedReader br = new BufferedReader(new InputStreamReader(is, charset))) {
            while ((line = br.readLine()) != null) {
                sb.append(line);
                // 同步到在線日志
                omsLogger.info(line);
            }
        } catch (Exception e) {
            log.warn("[ScriptProcessor] copyStream failed.", e);
            omsLogger.warn("[SYSTEM] copyStream failed.", e);

            sb.append("Exception: ").append(e);
        }
    }
copyStream會(huì)讀取InputStream到StringBuilder,同時(shí)打印到omsLogger

ShellProcessor

tech/powerjob/official/processors/impl/script/ShellProcessor.java

public class ShellProcessor extends AbstractScriptProcessor {
    @Override
    protected String getScriptName(Long instanceId) {
        return String.format("shell_%d.sh", instanceId);
    }
    @Override
    protected String getRunCommand() {
        return SH_SHELL;
    }
}
ShellProcessor的getScriptName是基于shell_%d.sh和instanceId生成的;其getRunCommand為/bin/sh

CMDProcessor

tech/powerjob/official/processors/impl/script/CMDProcessor.java

public class CMDProcessor extends AbstractScriptProcessor {
    @Override
    protected String getScriptName(Long instanceId) {
        return String.format("cmd_%d.bat", instanceId);
    }
    @Override
    protected String getRunCommand() {
        return "cmd.exe";
    }
    @Override
    protected Charset getCharset() {
        return Charset.defaultCharset();
    }
}
CMDProcessor的getScriptName是基于cmd_%d.bat和instanceId生成,其getRunCommand為`cmd.exe

PowerShellProcessor

tech/powerjob/official/processors/impl/script/PowerShellProcessor.java

public class PowerShellProcessor extends AbstractScriptProcessor {

    @Override
    protected String getScriptName(Long instanceId) {
        return String.format("powershell_%d.ps1", instanceId);
    }

    @Override
    protected String getRunCommand() {
        return "powershell.exe";
    }

    @Override
    protected Charset getCharset() {
        return Charset.defaultCharset();
    }
}
PowerShellProcessor的getScriptName是基于powershell_%d.ps1"和instanceId生成,其getRunCommand為powershell.exe

PythonProcessor

tech/powerjob/official/processors/impl/script/PythonProcessor.java

public class PythonProcessor extends AbstractScriptProcessor {

    @Override
    protected String getScriptName(Long instanceId) {
        return String.format("python_%d.py", instanceId);
    }

    @Override
    protected String getRunCommand() {
        return "python";
    }
}
PythonProcessor的getScriptName是基于python_%d.py和instanceId生成,其getRunCommand為python

小結(jié)

AbstractScriptProcessor繼承了CommonBasicProcessor,它有四個(gè)實(shí)現(xiàn)類分別是ShellProcessor、CMDProcessor、PowerShellProcessor、PythonProcessor;它定義了getScriptName、getRunCommand抽象方法;其process0方法主要是把scriptParams寫入到本地文件(scriptParams是http、https、ftp的則根據(jù)url進(jìn)行下載),然后修改權(quán)限為755,然后執(zhí)行pb.start(),再將input及errorStream收集到StringBuilder并打印到omsLogger,最后process.waitFor()等待處理完成。

以上就是PowerJob的AbstractScriptProcessor方法工作流程源碼解讀的詳細(xì)內(nèi)容,更多關(guān)于PowerJob AbstractScriptProcessor的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java8如何構(gòu)建一個(gè)Stream示例詳解

    Java8如何構(gòu)建一個(gè)Stream示例詳解

    Java 8 是迄今為止在語義上改動(dòng)上最大的一個(gè)平臺(tái)。下面這篇文章主要給大家介紹了關(guān)于Java8如何構(gòu)建一個(gè)Stream的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • Java基礎(chǔ)之String類使用與字符串比較

    Java基礎(chǔ)之String類使用與字符串比較

    String類代表字符串,java程序中的所有字符串文字(例如"abc")都被實(shí)現(xiàn)為此類的實(shí)例。本文將詳解String類的使用,以及如何進(jìn)行字符串比較
    2022-08-08
  • Java如何實(shí)現(xiàn)圖片裁剪預(yù)覽功能

    Java如何實(shí)現(xiàn)圖片裁剪預(yù)覽功能

    通常注冊(cè)賬戶上傳用戶圖像時(shí)需要進(jìn)行預(yù)覽,這篇文章就是教我們?nèi)绾斡?Java 實(shí)現(xiàn)圖片裁剪預(yù)覽功能,需要的朋友可以參考下
    2015-07-07
  • java 依賴包引入本地maven庫的實(shí)現(xiàn)示例

    java 依賴包引入本地maven庫的實(shí)現(xiàn)示例

    本文主要介紹了java 依賴包引入本地maven庫的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-12-12
  • Java使用PDFBox提取PDF文本并統(tǒng)計(jì)關(guān)鍵詞出現(xiàn)的次數(shù)

    Java使用PDFBox提取PDF文本并統(tǒng)計(jì)關(guān)鍵詞出現(xiàn)的次數(shù)

    這篇文章主要介紹了Apache PDFBox庫的基本知識(shí),包括如何使用PDDocument加載PDF文件、PDFTextStripper提取文本以及如何進(jìn)行詞頻統(tǒng)計(jì),還提供了在線URL的處理方法,需要的朋友可以參考下
    2025-05-05
  • Java TreeSet實(shí)現(xiàn)學(xué)生按年齡大小和姓名排序的方法示例

    Java TreeSet實(shí)現(xiàn)學(xué)生按年齡大小和姓名排序的方法示例

    這篇文章主要介紹了Java TreeSet實(shí)現(xiàn)學(xué)生按年齡大小和姓名排序的方法,涉及java類型轉(zhuǎn)換、遍歷、比較等相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09
  • Java如何為 PPT 中的圖形添加陰影效果

    Java如何為 PPT 中的圖形添加陰影效果

    這篇文章主要介紹了Java如何為 PPT 中的圖形添加陰影效果,幫助大家更好的利用java處理圖像,感興趣的朋友可以了解下
    2020-09-09
  • Java完全二叉樹的創(chuàng)建與四種遍歷方法分析

    Java完全二叉樹的創(chuàng)建與四種遍歷方法分析

    這篇文章主要介紹了Java完全二叉樹的創(chuàng)建與四種遍歷方法,結(jié)合實(shí)例形式分析了完全二叉樹的概念、定義及遍歷操作相關(guān)實(shí)現(xiàn)技巧,并對(duì)比分析了滿二叉樹與完全二叉樹的區(qū)別,需要的朋友可以參考下
    2017-11-11
  • java使用RSA與AES加密解密的實(shí)例代碼詳解

    java使用RSA與AES加密解密的實(shí)例代碼詳解

    這篇文章主要介紹了java使用RSA與AES加密解密的實(shí)例代碼,代碼簡單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-06-06
  • Java內(nèi)存模型JMM詳解

    Java內(nèi)存模型JMM詳解

    這篇文章主要介紹了Java內(nèi)存模型JMM詳解,涉及volatile和監(jiān)視器鎖,final字段,內(nèi)存屏障等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11

最新評(píng)論

安西县| 芜湖县| 稷山县| 米易县| 聂荣县| 云南省| 新宁县| 赣州市| 建湖县| 莫力| 界首市| 凉城县| 石渠县| 白山市| 涞源县| 随州市| 买车| 宁明县| 郯城县| 栖霞市| 蕲春县| 天全县| 临潭县| 确山县| 葫芦岛市| 南昌县| 乌拉特后旗| 巴塘县| 郴州市| 庆阳市| 塔河县| 甘肃省| 法库县| 秀山| 泰顺县| 广灵县| 上高县| 秦皇岛市| 清涧县| 旬阳县| 康马县|