Giriş
Şu satırı dahil
ederiz.
import org.apache.commons.exec.DefaultExecutor;
Açıklaması
şöyle. Sanırım en iyi özelliklerinden birisi ExecuteWatchdog ile zaman aşımına uğrayan process öldürülür
CommandLine
helps handling command lines specifying processes to execute.
DefaultExecutor
the default class to start a subprocess.
The implementation allows to set a current working directory for the subprocess
a) provide a set of environment variables passed to the subprocess
b) capture the subprocess output of stdout and stderr using an ExecuteStreamHandler
c) kill long-running processes using an ExecuteWatchdog
d) define a set of expected exit values
e) terminate any started processes when the main process is terminating using a ProcessDestroyer
Gradle
implementation group: 'org.apache.commons', name: 'commons-exec', version: '1.3'
constructor
Şöyle
yaparız.
Executor executor = new DefaultExecutor();
execute metodu - CommandLine
Diğer uygulamayı
senkron çalıştırır.
Örnek - ls komutu
Şöyle
yaparız
CommandLine cl = CommandLine.parse("ls -al");
DefaultExecutor executor = new DefaultExecutor();
int exitCode = executor.execute(cl);
Örnek - shell script
CommandLine commandLine = CommandLine.parse("sh ./hello.sh blogger");
DefaultExecutor defaultExecutor = new DefaultExecutor();
defaultExecutor.execute(commandLine);
execute metodu - CommandLine + ExecuteResultHandler
Diğer uygulamayı
asenkron çalıştırır. İmzası
şöyle.
public void execute(CommandLine command, ExecuteResultHandler handler)
throws ExecuteException, IOException
Genellikle DefaultExecuteResultHandler sınıfından kalıtan bir nesne kullanılır. Bu nesnenin onProcessComplete() ve onProcessFailed() metodları override edilir.
execute metodu - CommandLine + Map + ExecuteResultHandler
Diğer uygulamayı
asenkron çalıştırır. İmzası
şöyle. Diğerinden farklı olarak ortam değişkenlerini içeren bir Map nesnesi alır
public void execute(CommandLine command, Map<String,String> environment,
ExecuteResultHandler handler) throws ExecuteException, IOException
setExitValue metodu
Şöyle
yaparız
Executor executor = new DefaultExecutor();
executor.setExitValue(1);
setProcessDestroyer metodu
JVM kapanırken çalışmakta olan subprocess de öldürülür
Örnek
CommandLine cmd = new CommandLine("...")
.addArgument("...")
.addArgument("...")
.addArgument("...")
.addArgument("...");
logger.info("Command - "+ cmd.toString());
DefaultExecutor executor = new DefaultExecutor();
executor.setProcessDestroyer(new ShutdownHookProcessDestroyer());
executor.setStreamHandler(new PumpStreamHandler(null, null, null));
executor.setWatchdog(new ExecuteWatchdog(60_000));
executor.setExitValue(0);
try {
int exitValue = executor.execute(cmd);
if(exitValue != 0){
...
}
} catch (IOException ex) {
...
}
setStreamHandler metodu
ExecuteStreamHandler arayüzünden kalıtan
PumpStreamHandler kullanılabilir.
setWatchDog metodu
Milisaniye cinsindendir. 0'dan büyük bir değer olmalı
Örnek
Şöyle
yaparız. watchdog.killedProcess() çağrısı ile zaman aşımından dolayı process'in kapatılıp kapatılmadığı kontrol edilebilir.
long printJobTimeout = ...;
ExecuteWatchdog watchdog = new ExecuteWatchdog(printJobTimeout);
executor.setWatchdog(watchdog);