Viele FileNotFoundExceptions mit der Meldung "Datei wird zu oft geöffnet" werden im Fehlerprotokoll angezeigt.
Caused by: java.io.FileNotFoundException: /user/local/apache-tomcat-8/**/sample/WEB-INF/**/sample.jar (Die Datei ist zu viel geöffnet)
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.<init>(ZipFile.java:225)
at java.util.zip.ZipFile.<init>(ZipFile.java:155)
at java.util.jar.JarFile.<init>(JarFile.java:166)
at java.util.jar.JarFile.<init>(JarFile.java:103)
・
・
(Kürzung)
・
・
Caused by: java.io.FileNotFoundException: /user/local/apache-tomcat-8/**/sample/WEB-INF/**/sample.jar (Die Datei ist zu viel geöffnet)
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.<init>(ZipFile.java:225)
at java.util.zip.ZipFile.<init>(ZipFile.java:155)
at java.util.jar.JarFile.<init>(JarFile.java:166)
at java.util.jar.JarFile.<init>(JarFile.java:103)
Wenn Sie ProcessBuilder verwenden, werden InputStream, OutputStream und ErrorStream ohne Erlaubnis im Hintergrund geöffnet, sodass Ihnen anscheinend die Ressourcen ausgehen, wenn Sie nicht alle Streams schließen.
package sample;
import java.io.IOException;
public class ProcessExecutor {
public void execute(String... command) throws IOException {
ProcessBuilder processBuilder = new ProcessBuilder(command);
Process process = processBuilder.start();
process.waitFor();
process.destroy();
}
}
Der Fehler wurde behoben, indem allen Streams ein enger Prozess hinzugefügt wurde, wie unten gezeigt.
package sample;
import java.io.IOException;
public class ProcessExecutor {
public void execute(String... command) throws IOException {
ProcessBuilder processBuilder = new ProcessBuilder(command);
Process process = processBuilder.start();
process.waitFor();
//Später hinzugefügt
process.getInputStream().close();
process.getOutputStream().close();
process.getErrorStream().close();
process.destroy();
}
}
Recommended Posts