У меня есть класс, который действует как родительский процесс. Во время своего запуска он создает много дочерних процессов и запускает их одновременно. Каждый дочерний процесс - это в основном HTTP-клиент, который подключается к службе и извлекает данные из нее.связь между родительским процессом и дочерним процессом
В настоящее время, если один из дочерних процессов перестает работать по какой-либо причине, родительский процесс восстанавливает соединение путем перезапуска этого же дочернего процесса.
Отключение дочернего процесса может быть вызвано несколькими вещами. Я хотел бы сообщить причину отключения от дочернего процесса к родительскому процессу и привести к тому, что родительский процесс действует соответственно причине отказа (сбой чтения сокета, 404 не найден, 401 несанкционирован и т. Д.).
Возможно ли это? Какой был бы самый короткий/лучший способ сделать это? Вот мой родительский класс:
public class Parent {
public static void main(String[] args){
List<Process> PRlist = new ArrayList<Process>();
List<String[]> commandsList = new ArrayList<String[]>();
DateTimeFormatter frmt = DateTimeFormatter.ofPattern("hh:mm:ss");
if (args.length == 2 && args[0].matches("-f")){
String dir = System.getProperty("user.dir");
String path = dir + "/" + args[1];
try {
FileReader fr = new FileReader(path);
BufferedReader bf = new BufferedReader(fr);
String line = "";
while ((line = bf.readLine()) != null){
String[] tk = line.split(" ");
String[] cmd = {"java", "-jar", "Child.jar", "-a", tk[0], "-p", tk[1],
"-u", tk[2], "-pw", tk[3], "-m", tk[4], "-s", tk[5]};
Process pr = new ProcessBuilder().inheritIO().command(cmd).redirectInput(Redirect.INHERIT).start();
PRlist.add(pr); commandsList.add(cmd);
}
}
catch (FileNotFoundException ex) {ex.printStackTrace();}
catch (IOException ex) {ex.printStackTrace();}
int streamnum = PRlist.size();
while (true){
for (int i = 0; i < streamnum; i++){
if (!PRlist.get(i).isAlive()){
PRlist.get(i).destroy();
PRlist.remove(i);
try {
Process PR = new ProcessBuilder().inheritIO().command(commandsList.get(i)).redirectInput(Redirect.INHERIT).start();
System.out.println(commandsList.get(i)[12] + " stream re-established at " + LocalDateTime.now().format(frmt));
PRlist.add(i,PR);
} catch (IOException ex) {ex.printStackTrace();}
}
}
try {
Thread.sleep(5000);
} catch (InterruptedException ex) {ex.printStackTrace();}
}
} else {
System.out.println("No stream file was specified.");
}
}}
Любая помощь будет оценена.
Есть ли причина, по которой вы используете отдельные экземпляры JVM вместо потоков Java? Это будет более эффективно с точки зрения памяти и намного легче решить вашу проблему. –
+1 к @BorisShchegolev. Если у вас нет очень интересных аргументов, вам действительно нужно делать это с помощью ExecutorService и собирать необходимую информацию через Будущее. – lscoughlin
@BorisShchegolev Я только что написал это с самого начала, никакой особой причины. Если я изменю процессы o потоков, как бы вы порекомендовали решить мою проблему? любые примеры? –