Giriş
Şu satırı dahil ederiz.
Ş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
CommandLinehelps handling command lines specifying processes to execute.DefaultExecutorthe default class to start a subprocess.The implementation allows to set a current working directory for the subprocessa) provide a set of environment variables passed to the subprocessb) capture the subprocess output of stdout and stderr using an ExecuteStreamHandlerc) kill long-running processes using an ExecuteWatchdogd) define a set of expected exit valuese) terminate any started processes when the main process is terminating using a ProcessDestroyer
Kullanım örneği burada
Gradle
Şu satırı dahil ederiz
implementation group: 'org.apache.commons', name: 'commons-exec', version: '1.3'
constructorŞöyle yaparız.
Executor executor = new DefaultExecutor();
execute metodu - CommandLineDiğer uygulamayı senkron çalıştırır.
Örnek - ls komutu
Şöyle yaparız
Diğer uygulamayı asenkron çalıştırır. İmzası şöyle.
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
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.
Şöyle yaparız
CommandLine cl = CommandLine.parse("ls -al");
DefaultExecutor executor = new DefaultExecutor();
int exitCode = executor.execute(cl);
Örnek - shell script
Şöyle yaparız
CommandLine commandLine = CommandLine.parse("sh ./hello.sh blogger");
DefaultExecutor defaultExecutor = new DefaultExecutor();
defaultExecutor.execute(commandLine);
execute metodu - CommandLine + ExecuteResultHandler
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
setStreamHandler metodu
ExecuteStreamHandler arayüzünden kalıtan PumpStreamHandler kullanılabilir.Şö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
Şöyle yaparız
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) {
...
}
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);
Hiç yorum yok:
Yorum Gönder