我有一个使用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上,我需要一些指导,问题在哪里?什么可能导致套接字被关闭?我不想查看与此问题无关的事情。
答案 0 :(得分:0)
这是否会在固定的持续时间=连接超时(如30或60秒)之后发生,还是会立即失败?
如果是即时的,两个服务器之间是否建立了连接,即两者之间没有防火墙或其他限制 - 两个服务器之间是否ping
或telnet
工作?
测试设置与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);