You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Daniel Eriksson <se...@gmail.com> on 2011/11/30 21:32:55 UTC

Concurrency issue

Hi,

 I'm new to CXF and have what appears to be a concurrency issue using a CXF
web service in a web application. When load testing the application using
JMeter I sometimes end up getting incomplete results returned from the cxf
framework (i.e. objects with uninstantiated/null variables). Even though I
can verify using a LoggingInInterceptor on the client, that the web service
always returns the correct result.

I've included example code that reproduces the problem.

 The client is created and calls a service from within in a struts2 action:

*JaxWsProxyFactoryBean proxyFactoryBean = new JaxWsProxyFactoryBean();
proxyFactoryBean.setServiceClass(MyTestService.class);
String serviceURL = "http://" + request.getServerName() + ":" +
request.getServerPort() + SERVICE_NAME;
proxyFactoryBean.setAddress(serviceURL);
serviceProxy = (MyTestService) proxyFactoryBean.create();
PojoMap pojoMap = serviceProxy.getPojoList(someString0, someString1);*

//occasionally under load pojoMap.getPojoMap() will return null

Service interface:

@WebService
public interface MyTestService {
    public PojoMap getPojoList(
        @WebParam(name = "arg0") String arg0,
        @WebParam(name = "arg1") String arg1) throws Exception;
}

Service implementation:
@WebService(name = "MyTestServicePreLoaded", serviceName =
"MyTestServiceName")
public class MyTestServiceImpl implements MyTestService {
    public MyTestServiceImpl() {
        super();
    }
    @Override
    public PojoMap getPojoList(String arg0, String arg1) throws Exception {
        PojoMap pojoMap = performWork(arg0, arg1);
        return pojoMap;
    }

    private PojoMap performWork(String arg0, String arg1) {
        Map<String, PojoMapList> pml = new HashMap<String, PojoMapList>();
        PojoMapList pojoMapList = new PojoMapList();
        List<String> list = new ArrayList<String>();
        list.add(arg1);
        pojoMapList.setPojoMapList(list);
        pml.put(arg0, pojoMapList);
        PojoMap pojoMap = PojoMapFactory.createPojoMap(pml);
        return pojoMap;
    }
}

The objects being returned from the service:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class PojoMap {
    private Map<String, PojoMapList> pojoMap;
    public Map<String, PojoMapList> getPojoMap() {
        return pojoMap;

    }
    public void setPojoMap(Map<String, PojoMapList> pojoMap) {
        this.pojoMap = pojoMap;
    }
}

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class PojoMapList {

    private List<String> pojoMapList;
    public List<String> getPojoMapList() {
        return pojoMapList;
    }
    public void setPojoMapList(List<String> pojoMapList) {
        this.pojoMapList = pojoMapList;
    }
}

For testing purposes both client and service are deployed in the same
tomcat instance (tomcat 6). I'm using the latest (2.5.0) CXF release. Using
the same created JaxWsProxyFactoryBean as a singleton for all web service
calls makes no difference.

Any suggestions on what the problem might be or how to further debug the
problem?

Regards

Daniel

Re: Concurrency issue

Posted by Aki Yoshida <el...@googlemail.com>.
Hi,
I was wondering if you can try running your scenario with jetty
instead of tomcat and see if this also leads to the same problem. The
reason why I am asking this is that I have seen some buffering issue
with tomcat in the past.

thanks.
regards, aki


2011/11/30 Daniel Eriksson <se...@gmail.com>:
> Hi,
>
>  I'm new to CXF and have what appears to be a concurrency issue using a CXF
> web service in a web application. When load testing the application using
> JMeter I sometimes end up getting incomplete results returned from the cxf
> framework (i.e. objects with uninstantiated/null variables). Even though I
> can verify using a LoggingInInterceptor on the client, that the web service
> always returns the correct result.
>
> I've included example code that reproduces the problem.
>
>  The client is created and calls a service from within in a struts2 action:
>
> *JaxWsProxyFactoryBean proxyFactoryBean = new JaxWsProxyFactoryBean();
> proxyFactoryBean.setServiceClass(MyTestService.class);
> String serviceURL = "http://" + request.getServerName() + ":" +
> request.getServerPort() + SERVICE_NAME;
> proxyFactoryBean.setAddress(serviceURL);
> serviceProxy = (MyTestService) proxyFactoryBean.create();
> PojoMap pojoMap = serviceProxy.getPojoList(someString0, someString1);*
>
> //occasionally under load pojoMap.getPojoMap() will return null
>
> Service interface:
>
> @WebService
> public interface MyTestService {
>    public PojoMap getPojoList(
>        @WebParam(name = "arg0") String arg0,
>        @WebParam(name = "arg1") String arg1) throws Exception;
> }
>
> Service implementation:
> @WebService(name = "MyTestServicePreLoaded", serviceName =
> "MyTestServiceName")
> public class MyTestServiceImpl implements MyTestService {
>    public MyTestServiceImpl() {
>        super();
>    }
>    @Override
>    public PojoMap getPojoList(String arg0, String arg1) throws Exception {
>        PojoMap pojoMap = performWork(arg0, arg1);
>        return pojoMap;
>    }
>
>    private PojoMap performWork(String arg0, String arg1) {
>        Map<String, PojoMapList> pml = new HashMap<String, PojoMapList>();
>        PojoMapList pojoMapList = new PojoMapList();
>        List<String> list = new ArrayList<String>();
>        list.add(arg1);
>        pojoMapList.setPojoMapList(list);
>        pml.put(arg0, pojoMapList);
>        PojoMap pojoMap = PojoMapFactory.createPojoMap(pml);
>        return pojoMap;
>    }
> }
>
> The objects being returned from the service:
> @XmlRootElement
> @XmlAccessorType(XmlAccessType.FIELD)
> public class PojoMap {
>    private Map<String, PojoMapList> pojoMap;
>    public Map<String, PojoMapList> getPojoMap() {
>        return pojoMap;
>
>    }
>    public void setPojoMap(Map<String, PojoMapList> pojoMap) {
>        this.pojoMap = pojoMap;
>    }
> }
>
> @XmlRootElement
> @XmlAccessorType(XmlAccessType.FIELD)
> public class PojoMapList {
>
>    private List<String> pojoMapList;
>    public List<String> getPojoMapList() {
>        return pojoMapList;
>    }
>    public void setPojoMapList(List<String> pojoMapList) {
>        this.pojoMapList = pojoMapList;
>    }
> }
>
> For testing purposes both client and service are deployed in the same
> tomcat instance (tomcat 6). I'm using the latest (2.5.0) CXF release. Using
> the same created JaxWsProxyFactoryBean as a singleton for all web service
> calls makes no difference.
>
> Any suggestions on what the problem might be or how to further debug the
> problem?
>
> Regards
>
> Daniel