2015-06-01 29 views
0

我在java中使用HTMLUnit作爲訪問我的網站的「瀏覽器」。如何實現一個持有連接到網站的類,每個都在單獨的線程中同時進行?

這就是我想實現:

  1. 登錄到我的下不同的用戶名的網站在同一時間
  2. 保持所有連接活着,併爲每個用戶做不同的授權請求,同時該網站

如何解決工作解決方案?

截至目前,我有類「頁面」(Selenium風格),代表網頁上的單獨頁面,他們都是父頁面類的子類。 頁面類在其默認構造函數靜態連接中設置所有子類繼承。該連接後用於訪問網站上的其它網址/鏈接..

public abstract class Page { 
    protected Logger logger; 
    protected static Connection connection; 

    public Page(){ 
     connection = Connection.getConnection(); 
     this.logger = Logger.getLogger(this.getClass()); 
    } 
} 

連接類(單)返回單個實例,並且具有方法登錄到與方法沿網站訪問其他URL /鏈路

Connection connection = Connection.getConnection(); 
connection.login("http://somesite", "username", "password"); 
SomePage somePage = new SomePage(); // subclass of Page 
somePage.clickSomeLink(); 
etc.. 

現在,如果我在單獨的線程靜態連接的所有共享中運行它:網站

public class Connection { 
    private static final Logger logger = Logger.getLogger(ConnectionManager.class); 
    private static Connection connection; 
    private CookieManager cookieManager; 
    private WebClient browser; 

    private Connection() { 
     browser = new WebClient(BrowserVersion.CHROME); 
     cookieManager = browser.getCookieManager(); 
     cookieManager.setCookiesEnabled(true); 
    } 

    public static Connection getConnection() { 
     if (connection == null) { 
      connection = new Connection(); 
     } 
     return connection; 
    } 

    public void login(String url, String username, String password) { 
     // load url, get form, fill form, login.... etc 
    } 

.. other methods 
} 

比我使用它像這樣的其他線程使用它的權利?

那麼如何讓它同時工作呢?

..我想要使用連接的方法,從而共享所有頁面之間的連接,但僅限於一個線程..現在,如果這是不好的設計,可以做得更好,我會很高興聽到更好的方法。

+0

您可能不希望在用戶之間共享WebClient,如果它存儲了Cookie,那麼它們可能會在會話互相干擾的情況下導致問題。如果'WebClient'不是線程安全的以確保不是其他問題,那麼您也必須執行額外的同步。 –

+0

謝謝你的回覆,是的,正如我在答覆中所回答的,我想每個會話只有一個WebClient一個線程,只是不知道如何在頁面之間共享它而不會無休止地創建新實例。 – matty

回答

0

你不應該分享你的線程之間Connection類的實例,因爲incapsulated對象WebClient不是線程安全的,看到的Javadoc WebClient

注:一個Web客戶端實例不是線程安全的。它旨在從單個線程使用 。

CookieManager是線程安全的,但爲什麼你要在你的用戶之間共享cookie?

基準線是,你不應該使你的Connection類成爲單例,而是爲每個用戶/線程創建一個新類。

+0

謝謝您的回覆。 是的,CookieManager是我的壞,它不會被用戶共享。 至於WebClient,這就是我正在尋找的,每個線程使用一個實例,所以我不必擔心線程安全。 但如何將Connection(WebClient)傳遞給其他頁面? 現在,如果我將它從單例更改爲公共構造函數,每個新頁面都將創建一個Connection的新實例,從而WebClient。如何解決這個問題? – matty

+1

然後,不要在頁面內創建連接,只需創建一個連接並將其作爲參數構造函數傳遞給單個用戶的所有頁面實例。 –

+0

哦,我以前怎麼沒有想到這一點,那正是我所需要的。非常感謝! – matty

相關問題