13 years ago
java.util.ConcurrentModificationException
Hi,
I am facing concurrent modification issue when trying to run WsdlTeststep in parallel.
Here is actual exception.
2012-07-20 16:14:44,103 ERROR [WsdlSubmit] Exception in request: java.util.ConcurrentModificationException
2012-07-20 16:14:44,103 ERROR [errorlog] java.util.ConcurrentModificationException
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:819)
at java.util.ArrayList$Itr.next(ArrayList.java:791)
at org.apache.commons.httpclient.HeaderGroup.getHeaders(HeaderGroup.java:143)
at org.apache.commons.httpclient.HttpMethodBase.setRequestHeader(HttpMethodBase.java:475)
at org.apache.commons.httpclient.HttpMethodBase.setRequestHeader(HttpMethodBase.java:464)
at com.eviware.soapui.impl.wsdl.submit.filters.SoapHeadersRequestFilter.filterWsdlRequest(SoapHeadersRequestFilter.java:49)
at com.eviware.soapui.impl.wsdl.submit.filters.AbstractRequestFilter.filterAbstractHttpRequest(AbstractRequestFilter.java:37)
at com.eviware.soapui.impl.wsdl.submit.filters.AbstractRequestFilter.filterRequest(AbstractRequestFilter.java:31)
at com.eviware.soapui.impl.wsdl.submit.transports.http.HttpClientRequestTransport.sendRequest(HttpClientRequestTransport.java:133)
at com.eviware.soapui.impl.wsdl.WsdlSubmit.run(WsdlSubmit.java:123)
at com.eviware.soapui.impl.wsdl.WsdlSubmit.submitRequest(WsdlSubmit.java:76)
at com.eviware.soapui.impl.wsdl.WsdlRequest.submit(WsdlRequest.java:238)
at com.eviware.soapui.impl.wsdl.teststeps.WsdlTestRequestStep.run(WsdlTestRequestStep.java:366)
at com.eviware.soapui.model.testsuite.TestStep$run.call(Unknown Source)
at Script1$_run_closure2.doCall(Script1.groovy:47)
at sun.reflect.GeneratedMethodAccessor61.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:885)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:66)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:141)
at Script1$_run_closure2.doCall(Script1.groovy)
at sun.reflect.GeneratedMethodAccessor60.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:885)
at groovy.lang.Closure.call(Closure.java:405)
at org.codehaus.groovy.runtime.ConvertedMap.invokeCustom(ConvertedMap.java:48)
at org.codehaus.groovy.runtime.ConversionHandler.invoke(ConversionHandler.java:82)
at $Proxy11.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
Seams that Wsdl Request runner in not-thread safe somehow...
What i need to do is actully very simple action - to call particual WSDLRequestStep from different threads (programatically without Load Test as it can't be used in my case - doesn't really mather why it can't be used...).
Could you please advice how to make WsdlRequest thread-safe?
Thank you
I am facing concurrent modification issue when trying to run WsdlTeststep in parallel.
import java.util.concurrent.*
// use thread-local for effective multi-threaded params exchange!
context.numbers = new ThreadLocal()
def stepName = testRunner.testCase.getPropertyValue("concurrent_step_name")
def project = context.testCase.testSuite.project
def threads = Integer.parseInt(project.getPropertyValue("threads_count"))
def stepsTestCase = project.getTestSuiteByName("common").getTestCaseByName("steps")
def runTestStep = stepsTestCase.getTestStepByName(stepName)
def pool = Executors.newFixedThreadPool(threads)
def queue = new ConcurrentLinkedQueue()
// initialize test numbers - read from DB
context.dbConnection.eachRow("select MSISDN from test_numbers_for_orders") {
queue.add(it.MSISDN)
}
log.info "running ${stepName} soapUI requests concurrently[threads=${threads}]..."
def minTook = 0
def maxTook = 0
def totalTook = 0
def queueSize = queue.size()
for(i in 0..threads) {
pool.execute([run: {
while(true) {
def next = queue.poll()
if(next == null) {
log.info "Thread ${Thread.currentThread().getName()} exiting..."
break;
}
context.numbers.set(next)
// this this page http://www.soapui.org/apidocs/com/eviware/soapui/impl/wsdl/teststeps/WsdlTestStepResult.html
runTestStep.prepare(testRunner, context)
def result = runTestStep.run(testRunner, context)
runTestStep.finish(testRunner, context)
def took = result.getTimeTaken()
totalTook += took
log.info "subscriber ${next} dropped, thread ${Thread.currentThread().getName()}. took=${took}, size=${result.getSize()}"
if(took >= maxTook) maxTook = took
if(took <= minTook) minTool = took
}
}] as Runnable)
}
pool.shutdown()
pool.awaitTermination(60, TimeUnit.MINUTES)
Here is actual exception.
2012-07-20 16:14:44,103 ERROR [WsdlSubmit] Exception in request: java.util.ConcurrentModificationException
2012-07-20 16:14:44,103 ERROR [errorlog] java.util.ConcurrentModificationException
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:819)
at java.util.ArrayList$Itr.next(ArrayList.java:791)
at org.apache.commons.httpclient.HeaderGroup.getHeaders(HeaderGroup.java:143)
at org.apache.commons.httpclient.HttpMethodBase.setRequestHeader(HttpMethodBase.java:475)
at org.apache.commons.httpclient.HttpMethodBase.setRequestHeader(HttpMethodBase.java:464)
at com.eviware.soapui.impl.wsdl.submit.filters.SoapHeadersRequestFilter.filterWsdlRequest(SoapHeadersRequestFilter.java:49)
at com.eviware.soapui.impl.wsdl.submit.filters.AbstractRequestFilter.filterAbstractHttpRequest(AbstractRequestFilter.java:37)
at com.eviware.soapui.impl.wsdl.submit.filters.AbstractRequestFilter.filterRequest(AbstractRequestFilter.java:31)
at com.eviware.soapui.impl.wsdl.submit.transports.http.HttpClientRequestTransport.sendRequest(HttpClientRequestTransport.java:133)
at com.eviware.soapui.impl.wsdl.WsdlSubmit.run(WsdlSubmit.java:123)
at com.eviware.soapui.impl.wsdl.WsdlSubmit.submitRequest(WsdlSubmit.java:76)
at com.eviware.soapui.impl.wsdl.WsdlRequest.submit(WsdlRequest.java:238)
at com.eviware.soapui.impl.wsdl.teststeps.WsdlTestRequestStep.run(WsdlTestRequestStep.java:366)
at com.eviware.soapui.model.testsuite.TestStep$run.call(Unknown Source)
at Script1$_run_closure2.doCall(Script1.groovy:47)
at sun.reflect.GeneratedMethodAccessor61.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:885)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:66)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:141)
at Script1$_run_closure2.doCall(Script1.groovy)
at sun.reflect.GeneratedMethodAccessor60.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:885)
at groovy.lang.Closure.call(Closure.java:405)
at org.codehaus.groovy.runtime.ConvertedMap.invokeCustom(ConvertedMap.java:48)
at org.codehaus.groovy.runtime.ConversionHandler.invoke(ConversionHandler.java:82)
at $Proxy11.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
Seams that Wsdl Request runner in not-thread safe somehow...
What i need to do is actully very simple action - to call particual WSDLRequestStep from different threads (programatically without Load Test as it can't be used in my case - doesn't really mather why it can't be used...).
Could you please advice how to make WsdlRequest thread-safe?
Thank you