1

i want to execute a projectB from a projectA with 2 ProcessBuilder. It works but i have to comment first ProcessBuilder to execute second.

here my first code (only 1 file named F04_C.java)

@FXML
private void executerFichierJava02() {
    System.out.println("");
    System.out.println("method: executerFichierJava02()");
    System.out.println("create 1 Service and 1 Task");
    System.out.println("return 1 ProcessBuilder to");
    System.out.println("execute 1 Java class (from project JavaFX_Test02_Desvstory)");

    final Service<Integer> service01 = new Service<Integer>() {
        
        // override createTask() method
        @Override
        protected Task<Integer> createTask() {
            
            return new Task<Integer>() {
                
                // override call() method
                @Override
                protected Integer call() throws Exception {
                    // first ProcessBuilder
                    ProcessBuilder process01 = new ProcessBuilder("/usr/bin/javac", "-d", "./out", "../JavaFX_Test01_Hello_Devstory/src/module-info.java", "../JavaFX_Test01_Hello_Devstory/src/application/Main.java");
                    // second ProcessBuilder
                    ProcessBuilder process01 = new ProcessBuilder("/usr/bin/java", "-p", "./out", "-m", "JavaFX_Test01_Hello_Devstory/application.Main");
                    
                    return process01
                            .inheritIO()
                            .start()
                            .waitFor();
                }
            };  
        }
    };

    // step start Service
    serviceB = service01;
    serviceB.start();       

}

already said:

i have to comment first or second ProcessBuilder, i can not run the program with both instructions. So after researches i found a link to help me to get my goal. How to return 2 values from a Java method?

it tells to create a class (the best way) to return the instance i want to return.

So, with the link above i wrote a class to return 2 ProcessBuilder

i show you the class file and the updated F04_C.java file

package application.model;

public class ClassPB {
    
    //
    private ProcessBuilder pb01 = new ProcessBuilder();
    private ProcessBuilder pb02 = new ProcessBuilder();
    
    // constructeur(s)
    public ClassPB(ProcessBuilder p_pb01, ProcessBuilder p_pb02) {
        this.pb01 = p_pb01;
        this.pb02 = p_pb02;
    }
    
    // getter(s)
    public ProcessBuilder getPB01() {
        return this.pb01;
    }
    
    public ProcessBuilder getPB02() {
        return this.pb02;
    }
}

the F04_C.java updated

@FXML
private void executerFichierJava02() {
    System.out.println("");
    System.out.println("method: executerFichierJava02()");
    System.out.println("create 1 Service and 1 Task");
    System.out.println("return 1 ProcessBuilder to");
    System.out.println("execute 1 Java class (from project JavaFX_Test02_Desvstory)");

    final Service<Integer> service01 = new Service<Integer>() {
        
        // override createTask() method
        @Override
        protected Task<Integer> createTask() {
            
            return new Task<Integer>() {
                
                // override call() method
                @Override
                protected Integer call() throws Exception {
                    
                    ClassPB pbCombines = something();
                    return pbCombines;  
                }
            };
        }
    };

    serviceB = service01;
    serviceB.start();       
        
}

public static ClassPB something() {
    ProcessBuilder pb01 = new ProcessBuilder("/usr/bin/javac", "-d", "./out", "../JavaFX_Test01_Hello_Devstory/src/module-info.java", "../JavaFX_Test01_Hello_Devstory/src/application/Main.java");
    ProcessBuilder pb02 = new ProcessBuilder("/usr/bin/java", "-p", "./out", "-m", "JavaFX_Test01_Hello_Devstory/application.Main");
    
    try {
        pb01
        .inheritIO()
        .start()
        .waitFor();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    
    try {
        pb02
        .inheritIO()
        .start()
        .waitFor();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    
    return new ClassPB(pb01, pb02);
}

But now i have a problem: i have to return an Integer and i don't know how to solve this. Any advices, clues?

Thank you

Muhammad Sulaiman
  • 2,399
  • 4
  • 14
  • 28
redrabbit
  • 41
  • 5
  • What will the integer be if the first process returns 0 and the second 1? Or the first returns 42 and the second 21? What do you want to return? – knittl Oct 03 '22 at 10:01

1 Answers1

1

Ok, i answer myself.

I found a solution, maybe not a (very) good one but it works.

The class file ClassPB did not change, i did not publish it.

I changed the F04_C.java file as follows:

  • create a scope class variable named "state"
  • create callbacks to know the state of service01
  • the "state" class variable follows the state of service01 and gets a value for each state of service01
  • the value of "state" variable is returned inside the Service (Task)

Here is the code:

@FXML
    private void executerFichierJava02() {
        
        final Service<Integer> service01 = new Service<Integer>() {
            
            // --- step 03, override createTask() method
            @Override
            protected Task<Integer> createTask() {
                
                return new Task<Integer>() {
                    
                    // --- step 04, override call() method
                    @Override
                    protected Integer call() throws Exception {
                        
                        ClassPB pbCombines = retourner2ProcessBuilder("/usr/bin/javac",
                                                        "-d",
                                                        "./out",
                                                        "../JavaFX_Test01_Hello_Devstory/src/module-info.java",
                                                        "../JavaFX_Test01_Hello_Devstory/src/application/Main.java",
                                                        "/usr/bin/java",
                                                        "-p",
                                                        "./out",
                                                        "-m",
                                                        "JavaFX_Test01_Hello_Devstory/application.Main");
                                                
                        // state class variable scope to follow
                        // state of service01
                        // if everything is okay, setted to 1, 2 then 3
                        return state;
                    }
                    
                };
                
            }
            
        };
        
        service01.setOnReady(event -> {
            // not displayed into console
            System.out.println("service 01 ready");
            System.out.println("value of state: " + state);
            System.out.println("value of getException(): " + service01.getException());
            System.out.println("value of getValue(): " + service01.getValue());
            
        });
        service01.setOnScheduled(event -> {
            System.out.println("service 01 scheduled");
            state = 1;
            System.out.println("value of state: " + state);
            System.out.println("value of getException(): " + service01.getException());
            System.out.println("value of getValue(): " + service01.getValue());
        });
        service01.setOnRunning(event -> {
            System.out.println("service 01 running...");
            state = 2;
            System.out.println("value of state: " + state);
            System.out.println("value of getException(): " + service01.getException());
            System.out.println("value of getValue(): " + service01.getValue());
        });
        service01.setOnSucceeded(event -> {
            System.out.println("service 01, state, success");
            System.out.println("service 01, state, finished");
            state = 3;
            System.out.println("value of state: " + state);
            System.out.println("value of getException(): " + service01.getException());
            System.out.println("value of getValue(): " + service01.getValue());
        });
        service01.setOnFailed(event -> {
            System.out.println("service 01, state, failed");
            System.err.println("service failed");
            state = 4;
            System.out.println("value of state: " + state);
            service01.getException().printStackTrace();
            System.out.println("value of getException(): " + service01.getException());
            System.out.println("value of getValue(): " + service01.getValue());
        });
        service01.setOnCancelled(event -> {
            System.out.println("service 01, state, cancelled");
            state = 5;
            System.out.println("value of state: " + state);
            System.out.println("value of getException(): " + service01.getException());
            System.out.println("value of getValue(): " + service01.getValue());
        });
        
        // --------------------------------------------------------
        
        // start Service
        
        serviceB = service01;
        serviceB.start();       
        
    }
    
    // =======================================================
    
    // methode 07C
    public static ClassPB retourner2ProcessBuilder(String p01,
                                    String p02,
                                    String p03,
                                    String p04,
                                    String p05,
                                    String p06,
                                    String p07,
                                    String p08,
                                    String p09,
                                    String p10) {
        // ProcessBuilder pb01 = new ProcessBuilder("/usr/bin/javac", "-d", "./out", "../JavaFX_Test01_Hello_Devstory/src/module-info.java", "../JavaFX_Test01_Hello_Devstory/src/application/Main.java");
        ProcessBuilder pb01 = new ProcessBuilder(p01, p02, p03, p04, p05);
        
        // ProcessBuilder pb02 = new ProcessBuilder("/usr/bin/java", "-p", "./out", "-m", "JavaFX_Test01_Hello_Devstory/application.Main");
        ProcessBuilder pb02 = new ProcessBuilder(p06, p07, p08, p09, p10);
        
        try {
            pb01
            .inheritIO()
            .start()
            .waitFor();
        } catch (InterruptedException except) {
            except.printStackTrace();
        } catch (IOException except) {
            except.printStackTrace();
        }
        
        try {
            pb02
            .inheritIO()
            .start()
            .waitFor();
        } catch (InterruptedException except) {
            except.printStackTrace();
        } catch (IOException except) {
            except.printStackTrace();
        }
        
        return new ClassPB(pb01, pb02);
    }

I tried to be clear with my English. I hope you will understand cause I translated few sentences.

retourner2ProcessBuilder() has 10 args:
5 for the first ProcessBuilder
5 for the second ProcessBuilder

The goal of this:
To read a settings.properties file with all my projects and being able to run through my main project.

Thank you.
Bye

lambo9495
  • 5
  • 4
redrabbit
  • 41
  • 5