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