套接字关闭尝试连接到weblogic上部署的Axis2 Web服务

时间:2011-02-03 17:37:37

标签: java web-services deployment cxf weblogic-10.x

我有一个使用Apache CXF与Axis2 Web服务通信的应用程序。在测试环境中,一切进展顺利,移动到生产环境,发生以下异常:

INFO: Interceptor has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: Could not send Message.
    at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:64)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:220)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:466)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:299)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:251)
    at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:75)
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:124)
    at $Proxy131.retrieveAccountSummary(Unknown Source)
.
.
.

Caused by: java.net.SocketException: Socket Closed
    at java.net.PlainSocketImpl.setOption(PlainSocketImpl.java:201)
    at java.net.Socket.setTcpNoDelay(Socket.java:850)
    at weblogic.net.http.HttpClient.openServer(HttpClient.java:326)
    at weblogic.net.http.HttpClient.openServer(HttpClient.java:411)
    at weblogic.net.http.HttpClient.New(HttpClient.java:241)
    at weblogic.net.http.HttpURLConnection.connect(HttpURLConnection.java:176)
    at weblogic.net.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:242)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleHeadersTrustCaching(HTTPConduit.java:1836)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.onFirstWrite(HTTPConduit.java:1794)
    at org.apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutputStream.java:42)
    at org.apache.cxf.io.AbstractThresholdOutputStream.write(AbstractThresholdOutputStream.java:70)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1854)
    at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:66)
    at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:595)
    at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
    ... 40 more

据我所知,网络上没有任何内容正在终止连接,我从cxf配置增加了ConnectionTimeout和RecievingTimeout但没有用。

两个应用程序都部署在不同服务器上的weblogic 10.3.2.0上,我需要一些指导,问题在哪里?什么可能导致套接字被关闭?我不想查看与此问题无关的事情。

2 个答案:

答案 0 :(得分:0)

这是否会在固定的持续时间=连接超时(如30或60秒)之后发生,还是会立即失败?

如果是即时的,两个服务器之间是否建立了连接,即两者之间没有防火墙或其他限制 - 两个服务器之间是否pingtelnet工作?

测试设置与Live完全相同,即WLS和CXF版本是否相同? 另请参阅http://osdir.com/ml/users-cxf-apache/2010-03/msg00407.html

答案 1 :(得分:0)

现在问题已经解决了。

CXF客户端正在访问WSDL而没有任何问题,但在WSDL中,服务端口地址设置为localhost而不是服务器的IP地址:

<wsdl:service name="serviceName">
    <wsdl:port binding="tns:servicePortBinding" name="servicePort">
        <soap:address location="http://localhost:7001/app/services/service/" /> 
    </wsdl:port>
</wsdl:service>

我的应用程序试图将请求发送到localhost,当然结果是SocketException

原始WSDL中的soap地址设置为localhost,但是,当我创建Axis2 Web服务并将其部署在测试环境中时,地址已更新为机器IP地址(未发生)在UAT上。)

我不确定肥皂地址是如何以及何时更新的,但我想当机器有多个网络接口时,Axis将地址保留原样,或者可能将其更新为localhost

现在要修复此问题,我必须override the service address如下:

port = service.getMyServicePort();
BindingProvider provider = (BindingProvider) port;
String endpointAddress = "http://<ip address>:7001/app/services/service/";
provider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointAddress);