apache进程框架commons-exec,Java

阳兴文
2023-12-01

apache进程框架commons-exec,Java

pom.xml引用:

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-exec</artifactId>
            <version>1.3</version>
        </dependency>

import org.apache.commons.exec.*;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.Map;

public class Main {
    private static long processId = -1;

    public static void main(String[] args) {
        //无止境ping,但会再下面被ExecuteWatchdog设置的超时值终止进程而中断
        CommandLine commandLine = CommandLine.parse("ping 127.0.0.1 -t");

        DefaultExecutor executor = new DefaultExecutor() {
            @Override
            protected Process launch(CommandLine command, Map<String, String> env, File dir) throws IOException {
                Process process = super.launch(command, env, dir);
                processId = process.pid();
                System.out.println("进程id=" + processId);
                return process;
            }
        };
        executor.setExitValues(null);

        //如果进程运行时间超过timeOut毫秒,进程就自动结束(销毁)
        long timeOut = 5000;
        ExecuteWatchdog watchdog = new ExecuteWatchdog(timeOut);
        executor.setWatchdog(watchdog);

        final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        final ByteArrayOutputStream errorStream = new ByteArrayOutputStream();

        PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream, errorStream);
        executor.setStreamHandler(streamHandler);

        ExecuteResultHandler erh = new ExecuteResultHandler() {
            @Override
            public void onProcessComplete(int exitValue) {
                // exitValue 0 表示进程任务正常完成后结束退出。
                // exitValue非0值表示异常结束进程。
                System.out.println("exitValue:" + exitValue);

                try {
                    String os = outputStream.toString("GBK");
                    System.out.println("onProcessComplete:" + os);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onProcessFailed(ExecuteException e) {
                e.printStackTrace();

                try {
                    String es = errorStream.toString("GBK");
                    System.out.println("onProcessFailed:" + es);
                } catch (Exception ee) {
                    ee.printStackTrace();
                }
            }
        };

        try {
            executor.execute(commandLine, erh);
        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println("end");
    }
}

输出:

end
进程id=27652
exitValue:1
onProcessComplete:
正在 Ping 127.0.0.1 具有 32 字节的数据:
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=200
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=200
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=200
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=200
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=200

 类似资料: