我正在运行两个相互通信的axis2服务。在每次服务启动时,我都会收到此错误:
2014-02-24 13:02:31,258 [INFO ] HTTPSender - Unable to sendViaPost to url[http://127.0.0.1:8081/axis2/services/MYSERVICE1.MYSERVICE1HttpSoap12Endpoint/]
java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.commons.httpclient.protocol.ReflectionSocketFactory.createSocket(ReflectionSocketFactory.java:140)
at org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:125)
at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707)
at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.open(MultiThreadedHttpConnectionManager.java:1361)
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387)
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
at org.apache.axis2.transport.http.AbstractHTTPSender.executeMethod(AbstractHTTPSender.java:621)
at org.apache.axis2.transport.http.HTTPSender.sendViaPost(HTTPSender.java:193)
at org.apache.axis2.transport.http.HTTPSender.send(HTTPSender.java:75)
at org.apache.axis2.transport.http.CommonsHTTPTransportSender.writeMessageWithCommons(CommonsHTTPTransportSender.java:404)
at org.apache.axis2.transport.http.CommonsHTTPTransportSender.invoke(CommonsHTTPTransportSender.java:231)
at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:443)
at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:406)
at org.apache.axis2.description.OutInAxisOperationClient$NonBlockingInvocationWorker.run(OutInAxisOperation.java:446)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
由于此错误并不重要,我想抓住它并打印一些更好的错误消息而不是整个堆栈跟踪。我在哪里发现此错误?
答案 0 :(得分:1)
查看堆栈跟踪,我认为你无法捕获它。捕获它将需要您在线程中的某处抛出异常的代码。
查看跟踪中的最低堆栈显示:
at java.lang.Thread.run(Thread.java:724)
对我而言,这说明异常发生在最有可能由Axis开始的线程中。因此,您无法捕获它并显示错误消息。
如果这是预期的行为,那么您可以做的最好的事情是将日志记录框架配置为不显示来自Axis的INFO。请注意,这可能意味着您也会错过更多有用的错误消息。
总而言之,我将专注于如何解决“Unable to sendViaPost”而不是抑制日志声明。
回答您的评论问题:正如您从堆栈跟踪中看到的那样,任何客户端代码都不会捕获异常,但会将其冒充到Thread本身。这是异常停止点和停止点。如果你要捕获它,你必须在它的调用堆栈中有代码(你没有,因为当Axis创建线程时,为新线程Axis启动创建一个新的调用堆栈)。
了解更多here。在你的情况下唯一的区别是,由于没有在主线程上抛出异常,程序不会退出,但是发生异常的线程终止。
总结一下:调用堆栈中没有代码,因此无法捕获异常。唯一的另一种选择是转换Axis的INFO语句。
答案 1 :(得分:0)
如果我正确地理解了这个问题,那么你试图捕捉的东西不是被抛出的异常。
这:
HTTPSender - 无法将viaPost发送到网址[http://127.0.0.1:8081/axis2/services/MYSERVICE1.MYSERVICE1HttpSoap12Endpoint/]
是正在尝试的内容。当它失败时,它会抛出一个ConnectException。
你可以简单地抓住
try{
//Code that Makes the Connection
}
catch (ConnectException e)
{
e.printStackTrace();//Or What ever your message may be
}
如果没有看到某些代码,就无法给出明确的答案。但这可能会解决问题。
一个警告,如果你确实捕获了一个ConnectException来抑制它,你可以在实际上存在一个也会抛出ConnectException的问题时进行抑制。
如果在启动服务器时发生这种情况,您可能需要在尝试抑制它之前检查发生这种情况的原因。
如果它拒绝您正在尝试的连接,您可能希望确保它连接的位置有可用的连接套接字。
答案 2 :(得分:-1)
2014-02-24 13:02:31,258 [INFO] HTTPSender - 无法 sendViaPost到 URL [http://127.0.0.1:8081/axis2/services/MYSERVICE1.MYSERVICE1HttpSoap12Endpoint/]
好吧,如果仔细观察,您尝试捕获的消息根本不是ERROR
。这是INFO
生成的HTTPSender
日志。您应该在整个stacktrace
中捕获的内容仅为java.net.ConnectException
并检查消息Connection refused
。
您可以通过将java.net.ConnectException
与消息Connection refused
打包在一起,或者将原始异常作为原因引发自定义异常,从而使您的客户更容易并提供消息。
<强>更新强>
java.net.ConnectException
是网络交易中的基本例外。通常标准库不会捕获它们,除非有某些特定的要完成。
在这种情况下,如果您无法抓住java.net.ConnectException
,那么您可以注意抓住AxisFault
引发的org.apache.axis2.description.OutInAxisOperationClient.send
。
以下代码段可能对您有用。
try {
...
} catch (RemoteException ex) {
if(ex instanceof AxisFault){
logger.error("Axis Fault error: " + ((AxisFault)ex).getFaultString());
throw new CustomExcpetion(" Custom Message ");
}
}
另请注意,AxisFault
是java.rmi.RemoteException
的子类,当您在java.lang.Exception
语句中使用catch
时,这不会被捕获。
Shishir