2012-10-11 54 views
2

我有一個Web應用程序,我可以從其中啓動另一個Java應用程序中的相應測試過程。我正在使用Socket編程來進行Web應用程序和Java應用程序之間的通信。如何同時運行多個線程進行自動Selenium測試?

當我從web應用程序請求特定的進程時,Java應用程序的SocketServer會聽到請求並啓動一個線程進行測試過程。 測試過程將初始化FirefoxDriver並啓動瀏覽器並進行進一步的測試過程。

我的問題是,當我要求另一個進程具有不同的進程名稱,然後它再次創建第二個線程並啓動Firefox瀏覽器,但這次它不考慮我的第二個進程,它開始做相同的進程,這是第一個線程。

我不明白該怎麼辦......對於每一個過程,我創建了一個新的線程,但進一步它會做同樣的過程。 我的輸入在Java應用程序中正確接收。 請幫我我怎麼做併發線程安全處理? 我正在使用GWT,Java,Seleniun FirefoxDriver。

這裏是它在後臺運行,並聽取客戶端請求的服務器代碼:

static final int PORT = 6789; 

    public static void main(String args[]) { 
     ServerSocket serverSocket = null; 
     Socket socket = null; 
      try { 
      InitializeApplication application = new InitializeApplication(); 
      application.initialize(); 

      serverSocket = new ServerSocket(PORT); 
     } catch (Exception e) { 
      log("Exception in SocketServerExecutor !!!",e); 
     } 
     while (true) { 
      try { 
       socket = serverSocket.accept(); 
      } catch (Exception e) { 
       log("Exception in SocketServerExecutor !!!",e); 
      } 
      Thread thread = new Thread(new SocketServerThread(socket)); 
      thread.start(); 
     } 
    } 

,這是啓動過程中的主題:

private Socket client; 

     public SocketServerThread(Socket serverSocket) { 
      this.client = serverSocket; 
     } 

     /** 
     * Starts appropriate process depending on process name from input. 
     * Input string contains: 
     * process name 
     */ 
     public void run() { 
      DataOutputStream outputStream = null; 
      String param = null; 

      try{ 
       log("Just connected to "+ client.getRemoteSocketAddress()); 
        try { 
         while ((param = in.readUTF()) != null){ 
          log("got parameteres from client (i.e. from web app): "+param); 
          break; 
         } 
        } catch (Exception e) { } 
        if(param!=null && !param.isEmpty()){ 
         String process = params[0]; 

         ProcessManager manager = new ProcessManager(); 
         if(process.equals("testUser")) 
          manager.startUserProcess(process); 
         else if(process.equals("testCustomer")) 
          manager.startCustomerProcess(process); 

        } 
      }catch(Exception exc){ 
       if(exc instanceof SocketTimeoutException) 
        log("Socket timed out! [SocketServerThread]",exc); 
       else if(exc instanceof BindException) 
        log("BindException in SocketServerThread !!!",exc); 
       log(Level.SEVERE, "Exception in SocketServerThread !!!",exc); 
      } 
     } 

,這是ProcessManager的:

public void starUserProcess(String siteName) { 
     ExecutorService executerService = null; 
     try{ 
      Callable<Object> callable = new ProcessThread(siteName); 
      executerService = Executors.newCachedThreadPool(); 
      Future<Object> future = executerService.submit(callable); 
      future.get(); 

      log("[ProcessManager] Process completed for "+process); 
      System.exit(0); 
     }catch (Exception e) { 
      log("[ProcessManager]::Exception"); 
      log(ex); 
     } 
    } 

ProcessThread將初始化所有需要的東西和Firefox瀏覽器和啓動過程。 每次包含輸入的客戶端都是新的。

回答

0

得到了解決:我對每個新創建的ServerThread創建使用newSingleThreadExecutor(newCachedThreadPool(真)ExecutorService的代替()也setDeamon。 Here is the Executor documentation

0

我可以從頭頂上看到兩件事情之一。

  1. 你傳遞一個paramater到你的run()函數鏈接返回到初始線程或...

  2. 您使用的是共享變量,所有線程訪問,該變量要麼沒有正確更新,要麼根本沒有更新。

如果您可以包括一個SSCCE,這將有助於我們確定問題真正在哪裏。

+0

看到我編輯的問題... –

相關問題