簡單解決復(fù)雜的Oracle IAS問題
筆者做了一個小的系統(tǒng)輔助功能,可以周期性訪問某個URL、執(zhí)行某個SQL語句 or 執(zhí)行某個系統(tǒng)命令。
執(zhí)行SQL語句和系統(tǒng)命令比較簡單,這里不再詳述,主要說一下訪問某個URL。
實際上JDK自身已有工具類用于創(chuàng)建HTTP請求,類名是:java.net.HttpURLConnection,但考慮到基礎(chǔ)類通常比較粗糙,很多情況要自己考慮和處理,就轉(zhuǎn)頭去Google了下,發(fā)現(xiàn)果然有開源的工具包可以使用,幾個工具包中以HttpClient較為常用,而且是apache的東東,于是決定采用HttpClient。
從apache上down了包commons-httpclient-3.1.jar和commons-codec-1.3.jar兩個包,后者是HttpClient依賴的包。
幫助寫的很好,即便是像我這樣英文很爛,也能很快上手。
public boolean visitURL(String url) {
// Commons HttpClient 3.1
HttpClient client = new HttpClient();
HttpMethod method = new GetMethod(url);// Provide custom retry handler is necessary
method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(3, false));
boolean rs = false;
try {
// Execute the method.
int statusCode = client.executeMethod(method);if (statusCode != HttpStatus.SC_OK) {
logger.error("Method failed: " + method.getStatusLine());
}
else {
rs = true;
}} catch (HttpException e) {
logger.error("Fatal protocol violation: " + e.getMessage());
} catch (IOException e) {
logger.error("Fatal transport error: " + e.getMessage());
} finally {
// Release the connection.
method.releaseConnection();
}
return rs;
}
本機Tomcat下run一下,工作正常,隨即丟到服務(wù)器(Oracle IAS環(huán)境)上測試,程序應(yīng)該出乎意料的報了個錯。
09/03/16 19:03:43 java.lang.NoClassDefFoundError
09/03/16 19:03:43 at org.apache.commons.httpclient.HttpMethodBase.writeRequestLine(HttpMethodBase.java:2015)
09/03/16 19:03:43 at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:1864)
09/03/16 19:03:43 at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:975)
09/03/16 19:03:43 at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:368)
09/03/16 19:03:43 at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:164)
09/03/16 19:03:43 at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:437)
09/03/16 19:03:43 at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:324)
09/03/16 19:03:43 at com.zbht.util.TimerTaskManager.runURLTask(TimerTaskManager.java:237)
09/03/16 19:03:43 at _system._timer__task._test._jspService(_test.java:182)
09/03/16 19:03:43 at com.orionserver.http.OrionHttpJspPage.service(OrionHttpJspPage.java:59)
09/03/16 19:03:43 at oracle.jsp.runtimev2.JspPageTable.service(JspPageTable.java:462)
09/03/16 19:03:43 at oracle.jsp.runtimev2.JspServlet.internalService(JspServlet.java:594)
09/03/16 19:03:43 at oracle.jsp.runtimev2.JspServlet.service(JspServlet.java:518)
09/03/16 19:03:43 at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
09/03/16 19:03:43 at com.evermind.server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:713)
09/03/16 19:03:43 at com.evermind.server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:370)
09/03/16 19:03:43 at com.evermind.server.http.HttpRequestHandler.doProcessRequest(HttpRequestHandler.java:871)
09/03/16 19:03:43 at com.evermind.server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:453)
09/03/16 19:03:43 at com.evermind.server.http.AJPRequestHandler.run(AJPRequestHandler.java:302)
09/03/16 19:03:43 at com.evermind.server.http.AJPRequestHandler.run(AJPRequestHandler.java:190)
09/03/16 19:03:43 at oracle.oc4j.network.ServerSocketReadHandler$SafeRunnable.run(ServerSocketReadHandler.java:260)
09/03/16 19:03:43 at com.evermind.util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledExecutor.java:303)
09/03/16 19:03:43 at java.lang.Thread.run(Thread.java:595)
錯誤信息看上去比較低級:NoClassDefFoundError,類沒找到,迅速了檢查了一下本機和服務(wù)器上的jar包是否相同,“一模一樣”!這就奇怪了。
檢查本機的開發(fā)環(huán)境,只添加了這兩個jar,其他的都沒有動過,又檢查服務(wù)器的運行環(huán)境,一樣沒有變化。于是刪掉本機開發(fā)環(huán)境下的這兩個jar,問題浮出來了,類中對httpclient的7、8個引用中只有1個提示未找到指定的類,看來Oracle自己的某個包中已經(jīng)包含某個較低版本的httpclient,jar包沖突的問題是件讓人沮喪的事情,嘗試解決這種問題會所耗費的時間也許是其他方法的N倍,無心戀戰(zhàn)。
其實此處要進行的操作很簡單,就是訪問指定的URL,根據(jù)返回的內(nèi)容檢查是否成功,HttpClient是完整模擬瀏覽器,考慮了很多種問題,使用起來反倒是復(fù)雜了,決定轉(zhuǎn)用JDK的基礎(chǔ)類:java.net.HttpURLConnection
事情出奇的順利,空間里找到了之前寫的一個方法,正好解決這個問題,以下是代碼清單:
|
【編輯推薦】