I have written a SOAP client using CXF for several third-party SOAP
services.  I generated java code from the wsdl using wsdl2java.  The system
works, but it's inefficient (I'm creating a new proxy for every call), so I
thought I'd pool proxy objects.  That's when I first noticed the problem.

After extensive experimentation and hacking, I've found that if I attempt
to call a service twice with only a short delay, it consistently fails with
an exception (see below).  The "short delay" appears to almost 5 seconds.
If I put a 5-second delay in between re-uses, I can call it repeatedly
without any problems.  Now, I know this sounds crazy, but I've boiled it
down to pretty simple code.  At first I thought it was about re-use of a
proxy.  But further investigation has shown I have the same problem calling
different methods on the same service, and it happens if I have one proxy
or two.

I am starting to suspect a server-side problem, but it could be how I'm
creating the proxy.

So, in my mind, there's either a shared, stateful object (possibly a
socket/connection) that multiple proxies use that has a problem, or it's a
problem strictly on the server side.  If it's the former, I'd appreciate
help in changing my proxy creation technique.  If it's the latter, I'd like
to really be able to *prove* that it's caused by bad server side behaviour.

Any help appreciated.
Thanks

David Corbin


---exception---

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:271)
        at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:530)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:463)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:366)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:319)
        at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
        at 
org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:133)
        at com.sun.proxy.$Proxy46.login(Unknown Source)
        at SimpleCxfCheck.login(SimpleCxfCheck.java:39)
        at SimpleCxfCheck.testLoadApplicationContext(SimpleCxfCheck.java:23)
        at SimpleCxfCheck.main(SimpleCxfCheck.java:10)
Caused by: java.net.SocketException: SocketException invoking
http://somehost.zcorum.com:8996/axis2/services/IncEntitySecurityService:
Unexpected end of file from server
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at 
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
        at 
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
        at 
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.java:1338)
        at 
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1322)
        at 
org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
        at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:622)
        at 
org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
        ... 11 more
Caused by: java.net.SocketException: Unexpected end of file from server
        at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:718)
        at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:579)
        at 
sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1322)
        at 
java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:468)
        at 
org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.getResponseCode(URLConnectionHTTPConduit.java:260)
        at 
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1517)
        at 
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1490)
        at 
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1309)
        ... 14 more

---end----

---begin code sample---

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

import com.incognito.bcc.incentitysecurity.IncEntitySecurityPortType;
import com.incognito.bcc.incentitysecurity.Login;
import com.incognito.bcc.incentitysecurity.LoginResponse;


public class SimpleCxfCheck  {
    public static void main(final String[] args) {
        new SimpleCxfCheck().run();
    }
    private static final String URL =
"http://somehost.zcorum.com:8996/axis2/services/IncEntitySecurityService";;

    public void run()  {
        System.setProperty("org.apache.cxf.stax.allowInsecureParser", "1");
        final JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();
        factoryBean.setServiceClass(IncEntitySecurityPortType.class);
        factoryBean.setAddress(URL);

        final IncEntitySecurityPortType  portType =
(IncEntitySecurityPortType) factoryBean.create();

        System.out.println(login(portType, "zcuser", "password"));
        sleep(5000);
        System.out.println(login(portType, "zcuser", "password"));
    }

    private void sleep(final int milliSeconds) {
        try {
            Thread.sleep(milliSeconds);
        } catch (final InterruptedException e) {
            throw new RuntimeException("FIX ME", e);
        }
    }

    private String login(final IncEntitySecurityPortType portType,
final String loginName, final String password) {
        final Login parameters = new Login();
        parameters.setLoginName(loginName);
        parameters.setPassword(password);

        final LoginResponse loginResponse = portType.login(parameters);
        return loginResponse.getAuthorizationToken().getToken();
    }
}


---end code sample---

Reply via email to