我在java中使用HTMLUnit作爲訪問我的網站的「瀏覽器」。如何實現一個持有連接到網站的類,每個都在單獨的線程中同時進行?
這就是我想實現:
- 登錄到我的下不同的用戶名的網站在同一時間
- 保持所有連接活着,併爲每個用戶做不同的授權請求,同時該網站
如何解決工作解決方案?
截至目前,我有類「頁面」(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
}
比我使用它像這樣的其他線程使用它的權利?
那麼如何讓它同時工作呢?
..我想要使用連接的方法,從而共享所有頁面之間的連接,但僅限於一個線程..現在,如果這是不好的設計,可以做得更好,我會很高興聽到更好的方法。
您可能不希望在用戶之間共享WebClient,如果它存儲了Cookie,那麼它們可能會在會話互相干擾的情況下導致問題。如果'WebClient'不是線程安全的以確保不是其他問題,那麼您也必須執行額外的同步。 –
謝謝你的回覆,是的,正如我在答覆中所回答的,我想每個會話只有一個WebClient一個線程,只是不知道如何在頁面之間共享它而不會無休止地創建新實例。 – matty