本文作者最近碰到了一个简单的NoClassDefFoundError问题,不过针对这个涉及Oracle IAS的错误,却有十分简单的解决方案。

笔者做了一个小的体系辅佐功用,能够周期性拜访某个URL、履行某个SQL句子 or 履行某个体系指令。

简略处理杂乱的Oracle IAS问题(oracle is not)  Oracle IAS NoClassDefFoundError 第1张

履行SQL句子和体系指令比较简单,这儿不再胪陈,主要说一下拜访某个URL。

实际上JDK本身已有东西类用于创立HTTP恳求,类名是:java.net.HttpURLConnection,但考虑到根底类一般比较粗糙,许多状况要自己考虑和处理,就回头去Google了下,发现果然有开源的东西包能够运用,几个东西包中以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一下,作业正常,随即丢到服务器(Oracle IAS环境)上测验,程序应该出人意料的报了个错。

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,类没找到,敏捷了查看了一下本机和服务器上的jar包是否相同,“如出一辙”!这就奇怪了。

查看本机的开发环境,只添加了这两个jar,其他的都没有动过,又查看服务器的运转环境,相同没有改变。所以删掉本机开发环境下的这两个jar,问题浮出来了,类中对httpclient的7、8个引证中只要1个提示未找到指定的类,看来Oracle自己的某个包中现已包括某个较低版别的httpclient,jar包抵触的问题是件让人懊丧的工作,测验处理这种问题会所消耗的时刻也许是其他办法的N倍,无心恋战。

其实此处要进行的操作很简单,便是拜访指定的URL,依据回来的内容查看是否成功,HttpClient是完好模仿浏览器,考虑了许多种问题,运用起来反倒是杂乱了,决议转用JDK的根底类:java.net.HttpURLConnection

工作出奇的顺畅,空间里找到了之前写的一个办法,正好处理这个问题,以下是代码清单:

private boolean visitURL(String strUrl, String successFlag) {

boolean rs = false;
HttpURLConnection jconn = null;
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

try {
URL url = new URL(strUrl);

jconn = (HttpURLConnection) url.openConnection();
jconn.setDoOutput(true);
jconn.setDoInput(true);
jconn.connect();

InputStream in = jconn.getInputStream();
byte[] buf = new byte[4096];

int bytesRead;
while ((bytesRead = in.read(buf)) != -1) {
byteArrayOutputStream.write(buf, 0, bytesRead);
}

String strRead = new String(byteArrayOutputStream.toByteArray());

logger.debug(strRead);

strRead = StringUtil.NVL(strRead);

if(strRead.indexOf(successFlag) != -1) {
logger.info("Visit URL success !");
rs = true;
}

} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
jconn.disconnect();

try {
byteArrayOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}

return rs;
}

【修改引荐】

  1. 实例解说Oracle 9i数据坏块的处理
  2. Oracle 11g中完成自我调整功用
  3. Oracle数据库规划提高功能的五条规律
转载请说明出处
知优网 » 简略处理杂乱的Oracle IAS问题(oracle is not)

发表评论

您需要后才能发表评论