如何捕获“无法发送viaPost到url”?

时间:2014-02-24 12:06:45

标签: java web-services exception-handling axis2 axis

我正在运行两个相互通信的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)

由于此错误并不重要,我想抓住它并打印一些更好的错误消息而不是整个堆栈跟踪。我在哪里发现此错误?

3 个答案:

答案 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 ");
    }
}

另请注意,AxisFaultjava.rmi.RemoteException的子类,当您在java.lang.Exception语句中使用catch时,这不会被捕获。

Shishir