Restart Tomcat with Java

自作多情 提交于 2021-02-05 12:27:54

问题


I need to restart the tomcat from Java code.

For eg, if a query is not executed for a certain time Period then it will restart the tomcat automatically.

I have tried the following shutdown and startup code, but when we shutdown the tomcat then the java code will not run and tomcat not started.

Note :- I am running this code from a application and restarting the same tomact which the same application is using.

Following the code

try {

    PreparedStatement.setQueryTimeout(10);
    rs = PreparedStatement.executeQuery();

} catch (SQLException ex) {

   System.out.println("IN CATCH BLOCK FOR THE REFRESH INVOICE");

   String shutcommand = "killall java";
    Process shutchild = Runtime.getRuntime().exec(shutcommand);

    System.out.println("JAVA PROCESS KILLED");

    String locationCommand = "cd /root/cluster/tomcat6/bin";
    Process locationChild = Runtime.getRuntime().exec(locationCommand);

    String strtcommand = "./startup.sh";
    Process strtchild = Runtime.getRuntime().exec(strtcommand);
}

回答1:


Killing tomcat after SQLException this is not good idea to handle this exception. Probably the problem is on database site.

But if you are sure, that it is what you need you can kill this java proces in this section, but to run tomcat you should use for example bash and cron. Why? Beacues after killing your executing code will stop, so you don't achieve the line to start tomcat.

How to check tomcat: Is Tomcat running?




回答2:


TL;DR

File binaryDir = new File(System.getProperty("catalina.home") + File.separator + "bin");
String restartCommand = "\"shutdown.bat & ping 0.0.0.0 -n 4 & C:\\WINDOWS\\system32\\net start Tomcat8\"";
new ProcessBuilder("cmd", "/c", restartCommand).directory(binaryDir).start();

Survive

Creating new process will survive JVM shutdown. If you combine commands in one line it should work fine according to my tests and this.

shutdown.bat

You need to use shutdown.bat instead stopping windows service because it often fails on Windows with message Cannot stop service Apache Tomcat...

ping 0.0.0.0 -n 4

You need to wait some time after shutdown otherwise you will get Service is already starting. Try again later error message. Also note I use ping instead timeout because it causes problems on some systems.

C:\WINDOWS\system32\net start Tomcat8

I'm starting windows service because invoking startup.bat won't work for me. Also remember to replace Tomcat8 if you using different tomcat or custom service name for example Tomcat7

Redirect I/O

Don't redirect input or output of process instance or command will shutdown with JVM, and Tomcat won't start.




回答3:


You can execute this native command using java

String command = "c:\program files\tomcat\bin\startup.bat";//for linux use .sh
Process child = Runtime.getRuntime().exec(command);



回答4:


You should consider using ProcessBuilder instead of Runtime exec. Also, you should split all the arguments when you want to execute a command.

I suggest this :

ProcessBuilder shutcommand = new ProcessBuilder("killall", "java");
Process shutchild = shutcommand.start();

System.out.println("JAVA PROCESS KILLED");

ProcessBuilder strtcommand = new ProcessBuilder("/root/cluster/tomcat6/bin/startup.sh", "java");
Process strtchild = strtcommand.start();


来源:https://stackoverflow.com/questions/48109709/restart-tomcat-with-java

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!