Моей основной областью является .NET, но недавно у меня есть что-то, чтобы сделать с Java. Я должен создать утилиту оболочки в Java, который мог выполнить в дополнительном чтении немного записей базы данных после указанной продолжительности и сделать последующую обработку. Это - своего рода планировщик. Теперь у меня есть немного проблем:
Как сделать эту работу как услуга. Я хочу выполнить его через сценарий оболочки, и утилита должна начать работать. От курса управление должно возвратиться к сценарию выполнения вызова.
Во-вторых, в конечном счете я могу хотеть мешать этому процессу работать. Как достигнуть этого?
Я понимаю, что это основной вопрос, но я действительно понятия не имею, где начать и какие варианты являются наилучшими для меня.
Какая-либо справка / советует?
Я бы пошел для запуска программы с помощью планировщика или службы. Однако, если вы хотите использовать bat-файл и делать это программно, я описал возможный подход ниже:
В вашей программе на Java вы можете получить PID программно, а затем записать его в файл:
public static void writePID(String fileLocation) throws IOException
{
// Use the engine management bean in java to find out the pid
// and to write to a file
if (fileLocation.length() == 0)
{
fileLocation = DEFAULT_PID_FILE;
}
String pid = ManagementFactory.getRuntimeMXBean().getName();
if (pid.indexOf("@") != -1)
{
pid = pid.substring(0, pid.indexOf("@"));
}
BufferedWriter writer = new BufferedWriter(new FileWriter(fileLocation));
writer.write(pid);
writer.newLine();
writer.flush();
writer.close();
}
Вы затем можно написать стоп-файл .bat, который убьет запущенную программу в Windows. Вы можете сделать что-то вроде:
setlocal
IF EXIST app.pid FOR /F %%i in ('type app.pid') do TASKKILL /F /PID %%i
IF EXIST app.pid DEL app.pid
endlocal
Конечно, app.pid - это файл, написанный указанным выше методом Java.
Я не уверен, как вы сможете написать сценарий, который запускает Java-программу и возвращает управление при завершении. Мне было бы интересно узнать, есть ли у кого-нибудь решение для этого.
Я предполагаю, что вы играете в свою java-программу с помощью Linux / Unix. Чтобы запустить приложение в качестве демона, вы можете попробовать
nohup java YourJavaClass &
Чтобы остановить приложение, вы можете:
kill [psIdofYourApplication]
или
fg [your application job Id]
Ctrl-C
Если вы хотите выполнить некоторую постобработку после того, как приложение получит сигнал «убить / остановить». проверьте addShutdownHook (Thread hook)
или sun.misc.SignalHandler
ps ux
см. pid
kill pid
Или вам лучше предоставить сценарий остановки, который сигнализирует приложению, которое выполняет System.exit (0)
Вы не указали платформу. Если на Windows, то вам следует рассмотреть возможность интеграции с Service Control для создания службы Windows. http://en.wikipedia.org/wiki/Windows_service. После внедрения крючков службы можно запускать и останавливать службу через графический интерфейс управления службами или используя синтаксис net stop MyService
из командной строки.
Насколько я понимаю, вам нужно что-то вроде этого:
if ( System.in.avaliable() > 0 ) {
in = new BufferedReader( new InputStreamReader( System.in );
String InLine = in.readLine();
...
}
Я прав?