2010-07-16 2 views
3

저는 각 클라이언트가 싱글 톤 ClientManager를 가지고있는 네트워크 어플리케이션을 작성하고 있습니다. 테스트의 경우에 대해 손으로 프로그램을 n 번 시작하지 않고 여러 클라이언트 (각각 고유 한 VM/프로세스에 있음)를 만들고 싶습니다.ProcessBuilder - 다른 프로세스/JVM 시작 - HowTo?

내 코드는 다음을 기반으로하지만, 제대로 동작하지 않습니다 :

유래에 다음과 같은 두 가지 질문에 이미 설명 어떻게에 그렇게

  • spawn이 호출 된 후 주 프로그램이 계속 실행되지 않습니다.
  • 스폰 된 코드가 실행되지 않습니다.

여기 ProcessBuilder를 사용하여 전체 코드입니다 :

public class NewVM { 
    static class HelloWorld2 { 
    public static void main(String[] args) { 
     System.out.println("Hello World"); 
     System.err.println("Hello World 2"); 
    } 
    } 
    public static void main(String[] args) throws Exception { 
    startSecondJVM(HelloWorld2.class, true); 
    startSecondJVM(HelloWorld2.class, false); 
    System.out.println("Main"); 
    } 
    public static void startSecondJVM(Class<? extends Object> clazz, boolean redirectStream) throws Exception { 
    System.out.println(clazz.getCanonicalName()); 
    String separator = System.getProperty("file.separator"); 
    String classpath = System.getProperty("java.class.path"); 
    String path = System.getProperty("java.home") 
      + separator + "bin" + separator + "java"; 
    ProcessBuilder processBuilder = 
      new ProcessBuilder(path, "-cp", 
      classpath, 
      clazz.getCanonicalName()); 
    processBuilder.redirectErrorStream(redirectStream); 
    Process process = processBuilder.start(); 
    process.waitFor(); 
    System.out.println("Fin"); 
    } 
} 

내가 잘못하고있는 중이 야 무슨 일이 ???

Btw는 : 나는 이클립스를 사용하고

  • .
  • 싱글 톤 문제는 예입니다. 을 입력하지 마십시오.은 공장을 만들 것을 제안합니다.

해결책 : HelloWorld2는 내부 클래스가 아니어야합니다.

답변

2

HelloWorld2를 최상위 클래스로 만들 것을 제안합니다. Java는 최상위 클래스를 기대합니다.

이것은 내가 시도한 코드입니다.

class Main 
{ 
    static class Main2 
    { 
     public static void main (String [ ] args) 
     { 
      System . out . println ("YES!!!!!!!!!!!") ; 
     } 
    } 

    public static void main (String [ ] args) 
    { 
     System . out . println (Main2 . class . getCanonicalName ()) ; 
     System . out . println (Main2 . class . getName ()) ; 
    } 
} 

class Main3 
{ 
    public static void main (String [ ] args) 
    { 
     System . out . println ("YES!!!!!!!!!!!") ; 
    } 
} 
  1. getCanonicalNamegetName 다른 이름을 반환. 어느 것이 옳은가? 둘 다 틀 렸습니다.
  2. Main3 작품입니다.
1

문제의 일부에 대한 픽스가 나타납니다. process.waitFor()은 하위 프로세스가 끝나기 전에 컨트롤이 main()으로 돌아 가지 않도록합니다.

스폰 된 프로세스가 시작되지 않는 이유를 알아 내기 위해 ProcessBuilder 생성자에 모든 인수를 출력하고 해당 인수로 호출되는 손 - JVM이 성공하는지 확인하는 것이 좋습니다. 특히 클래스 이름은 static void main(String[]) 인 클래스 이름이어야합니다.