【问题标题】:How to catch "Unable to sendViaPost to url"?如何捕捉“无法将ViaPost发送到网址”?
【发布时间】:2014-02-24 12:06:44
【问题描述】:

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

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

【问题讨论】:

  • ¿你是如何开始服务的?

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


【解决方案1】:

查看堆栈跟踪,我认为您无法捕捉到它。捕获它需要您在抛出异常的线程中的某个位置拥有代码。

查看跟踪中的最低堆栈显示:

at java.lang.Thread.run(Thread.java:724)

对我来说,这说明异常发生在最有可能由 Axis 启动的线程中。因此,您无法捕获它并显示错误消息。

如果这是预期的行为,您可以做的最好的事情是配置您的日志框架,使其不显示来自 Axis 的 INFO。请注意,这可能意味着您还会错过更多有用的错误消息。

总而言之,我将专注于如何解决“无法发送ViaPost”的问题,而不是抑制日志记录。

回答您的评论问题:正如您从堆栈跟踪中看到的那样,任何客户端代码都没有捕获到异常,而是冒泡到 Thread 本身。这是异常的停止点,也是它停止的地方。如果要捕获它,则必须在其调用堆栈中包含代码(您没有,因为当 Axis 创建线程时,会为新线程 Axis 启动创建一个新的调用堆栈)。

阅读更多here。在您的情况下,唯一的区别是,由于未在主线程上引发异常,因此程序不会退出,而是会终止发生异常的线程。

总结一下:调用堆栈中没有代码,因此无法捕获异常。唯一的其他选择是关闭 Axis 的 INFO 语句。

【讨论】:

  • 是的,对我来说,这似乎也是轴心国发出的信息,被谁抓住了?阿帕奇?
  • 在我的回答末尾查看我的回复。
  • 好的,谢谢杰森。仍然不相信 100%,但没有更多的时间放松。谢谢。
  • 我听到了。如果你有时间,如果你想亲自看看,我邀请你尝试其他方法。祝你好运!
【解决方案2】:

如果我正确理解了这个问题,那么您正在尝试捕捉不是被抛出的异常的东西。

这个:

HTTPSender - 无法将ViaPost 发送到 url[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 的问题时抑制它。

如果在您启动服务器时发生这种情况,您可能需要在尝试抑制它之前检查为什么会发生这种情况。

如果它拒绝您尝试的连接,您可能需要确保它连接到的位置有一个可用的套接字来连接。

【讨论】:

    【解决方案3】:

    2014-02-24 13:02:31,258 [INFO] HTTPSender - 无法 发送ViaPost到 网址[http://127.0.0.1:8081/axis2/services/MYSERVICE1.MYSERVICE1HttpSoap12Endpoint/]

    好吧,如果您仔细观察,您要捕获的消息根本不是ERROR。这是从HTTPSender 生成的INFO 日志。在整个stacktrace 中,您应该捕获的唯一内容是java.net.ConnectException 并检查消息Connection refused

    您可以通过使用消息Connection refused 包装java.net.ConnectException 或以原始异常为原因引发自定义异常,从而使您的客户更轻松并提供消息。

    更新

    java.net.ConnectException 是网络事务中的一个基本例外。通常标准库不会捕获它们,除非有特定的事情要做。

    在这种情况下,如果你无法捕捉到java.net.ConnectException,那么你可以留意捕捉org.apache.axis2.description.OutInAxisOperationClient.send抛出的AxisFault

    下面的sn-p可能对你有用。

    try {
        ...
    } catch (RemoteException ex) {
        if(ex instanceof AxisFault){
            logger.error("Axis Fault error: " + ((AxisFault)ex).getFaultString());
            throw new CustomExcpetion(" Custom Message ");
        }
    }
    

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

    希希尔

    【讨论】:

    • 我该怎么做?看看 Jason Nichols 的回答。谢谢。
    • 那行不通。除非您在抛出异常的堆栈中有代码,否则您无法捕获异常!
    • 可以通过各种方式捕获 AxisFault。由于它不是 Exception 的子类,因此您无法在堆栈跟踪中看到它。最后一个逻辑点 OutInAxiaOperation 抛出 AxisFault 并继续记录本机线程路径。不要混淆普通异常和远程异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 2020-08-25
    • 2018-04-12
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多