You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jmeter-dev@jakarta.apache.org by KiYun Roe <ki...@active-endpoints.com> on 2005/04/01 04:38:14 UTC
WebSerivceSampler not thread safe
Hi,
There's a comment at about line 108 of org.apache.jmeter.protocol.http.sampler.WebServiceSampler.java expressing concern that sharing a single DocumentBuilder might not be thread safe. Well, it's not. This explains the intermittent, mysterious failures that I've seen testing a web service from multiple JMeter threads.
Here's a possible patch using a ThreadLocal to allocate one DocumentBuilder per thread. I'm new to Jakarta. How do I get this into the source distribution?
Thanks.
-- KiYun Roe
Index: src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.java
===================================================================
RCS file: /home/cvspublic/jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.java,v
retrieving revision 1.17
diff -b -u -w -r1.17 WebServiceSampler.java
--- src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.java 6 Jan 2005 01:11:43 -0000 1.17
+++ src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.java 1 Apr 2005 02:16:39 -0000
@@ -112,7 +112,14 @@
* consider using Apache commons pool to create a pool of document builders
* or make sure XMLParserUtils creates builders efficiently.
*/
- private static DocumentBuilder XDB = null;
+ private static ThreadLocal ThreadLocalXDB =
+ new ThreadLocal()
+ {
+ protected Object initialValue()
+ {
+ return XMLParserUtils.getXMLDocBuilder();
+ }
+ };
private String FILE_CONTENTS = null;
@@ -413,10 +420,7 @@
*/
protected Document openDocument(String key)
{
- if (XDB == null)
- {
- XDB = XMLParserUtils.getXMLDocBuilder();
- }
+ DocumentBuilder XDB = (DocumentBuilder) ThreadLocalXDB.get();
Document doc = null;
// if either a file or path location is given,
// get the file object.
---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org
Throughput value drops almost to 0 when there are one or more unsuccessful results (was RE: WebServiceSampler not thread safe)
Posted by KiYun Roe <ki...@active-endpoints.com>.
BTW, the WebServiceSampler bug is vaguely related to bug 33940, reported by
someone else in my organization. We have found that when there's an
unsuccessful result, the throughput reported by the GUI drops to nearly 0,
because org.apache.jmeter.visualizers.SamplingStatCalculator.setStartTime()
sets firstTime to 0 at or around line 314 (which means elapsed time suddenly
becomes very large). It seems to me that perhaps the test preceding the
assignment should be something like "if ((firstTime > startTime) &&
(startTime > 0))", but I'm not familiar enough with JMeter to assume what
the calculations should do when there's an unsuccessful result (and in fact,
perhaps a more comprehensive solution would be to skip a portion of
org.apache.jmeter.visualizers.SamplingStatCalculator.addSample() for
unsuccessful results).
-- KiYun
-----Original Message-----
From: Peter Lin [mailto:woolfel@gmail.com]
Sent: Friday, April 01, 2005 5:02 PM
To: JMeter Developers List
Subject: Re: WebSerivceSampler not thread safe
the fail silently slipped by. It's suppose to log to jmeter's log, but
due to oversight on my part, it doesn't. I'll patch it tonight. rather
than make it threadlocal, I think I will just make it non static.
peter
On Apr 1, 2005 3:43 PM, KiYun Roe <ki...@active-endpoints.com> wrote:
> Sure. The errors I saw manifested themselves as unsuccessful results in
View
> Results Tree, etc. The statement
>
> openDocument(null).getDocumentElement();
>
> at about line 405 in WebServiceSampler.jar was throwing a null pointer
> exception, because the call to XDB.parse() was failing inside
openDocument()
> (because document builders are not thread safe). The null pointer
exception
> was caught at line 595 of WebServiceSampler.java, resulting in a call to
> RESULT.setSuccessful(false)--hence, the unsuccessful result.
>
> I personally found it easier to reproduce the problem by hitting a very
> simple web service on another machine from a basic multi-threaded test
plan.
> I guess the key is to spend as little time as possible invoking the web
> service, so that proportionally more time is spent preparing the
call--thus
> increasing the odds of finding more than one thread in the problematic
code.
>
> I have to say that I'm mystified by the practice of catching exceptions
and
> failing silently as demonstrated in openDocument(). I hope that's just
> temporary.
>
> -- KiYun
>
> -----Original Message-----
> From: Peter Lin [mailto:woolfel@gmail.com]
> Sent: Thursday, March 31, 2005 10:53 PM
> To: JMeter Developers List
> Subject: Re: WebSerivceSampler not thread safe
>
> thanks for the patch, i'll take a look this weekend when I get a
> chance. Out of curiousity, what kind of errors are you seeing. I've
> tested and profiled the sampler on several occasions using OptimizeIt
> and wasn't able to see any errors. any additional information you can
> provide would help make sure the bug is really fixed.
>
> thanks
>
> peter
>
> On Mar 31, 2005 9:38 PM, KiYun Roe <ki...@active-endpoints.com> wrote:
> > Hi,
> >
> > There's a comment at about line 108 of
> org.apache.jmeter.protocol.http.sampler.WebServiceSampler.java expressing
> concern that sharing a single DocumentBuilder might not be thread safe.
> Well, it's not. This explains the intermittent, mysterious failures that
> I've seen testing a web service from multiple JMeter threads.
> >
> > Here's a possible patch using a ThreadLocal to allocate one
> DocumentBuilder per thread. I'm new to Jakarta. How do I get this into the
> source distribution?
> >
> > Thanks.
> >
> > -- KiYun Roe
> >
> > Index:
>
src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.
> java
> > ===================================================================
> > RCS file:
>
/home/cvspublic/jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/
> http/sampler/WebServiceSampler.java,v
> > retrieving revision 1.17
> > diff -b -u -w -r1.17 WebServiceSampler.java
> > ---
>
src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.
> java 6 Jan 2005 01:11:43 -0000 1.17
> > +++
>
src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.
> java 1 Apr 2005 02:16:39 -0000
> > @@ -112,7 +112,14 @@
> > * consider using Apache commons pool to create a pool of document
> builders
> > * or make sure XMLParserUtils creates builders efficiently.
> > */
> > - private static DocumentBuilder XDB = null;
> > + private static ThreadLocal ThreadLocalXDB =
> > + new ThreadLocal()
> > + {
> > + protected Object initialValue()
> > + {
> > + return XMLParserUtils.getXMLDocBuilder();
> > + }
> > + };
> >
> > private String FILE_CONTENTS = null;
> >
> > @@ -413,10 +420,7 @@
> > */
> > protected Document openDocument(String key)
> > {
> > - if (XDB == null)
> > - {
> > - XDB = XMLParserUtils.getXMLDocBuilder();
> > - }
> > + DocumentBuilder XDB = (DocumentBuilder)
> ThreadLocalXDB.get();
> > Document doc = null;
> > // if either a file or path location is given,
> > // get the file object.
---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org
Re: WebSerivceSampler not thread safe
Posted by Peter Lin <wo...@gmail.com>.
the fail silently slipped by. It's suppose to log to jmeter's log, but
due to oversight on my part, it doesn't. I'll patch it tonight. rather
than make it threadlocal, I think I will just make it non static.
peter
On Apr 1, 2005 3:43 PM, KiYun Roe <ki...@active-endpoints.com> wrote:
> Sure. The errors I saw manifested themselves as unsuccessful results in View
> Results Tree, etc. The statement
>
> openDocument(null).getDocumentElement();
>
> at about line 405 in WebServiceSampler.jar was throwing a null pointer
> exception, because the call to XDB.parse() was failing inside openDocument()
> (because document builders are not thread safe). The null pointer exception
> was caught at line 595 of WebServiceSampler.java, resulting in a call to
> RESULT.setSuccessful(false)--hence, the unsuccessful result.
>
> I personally found it easier to reproduce the problem by hitting a very
> simple web service on another machine from a basic multi-threaded test plan.
> I guess the key is to spend as little time as possible invoking the web
> service, so that proportionally more time is spent preparing the call--thus
> increasing the odds of finding more than one thread in the problematic code.
>
> I have to say that I'm mystified by the practice of catching exceptions and
> failing silently as demonstrated in openDocument(). I hope that's just
> temporary.
>
> -- KiYun
>
> -----Original Message-----
> From: Peter Lin [mailto:woolfel@gmail.com]
> Sent: Thursday, March 31, 2005 10:53 PM
> To: JMeter Developers List
> Subject: Re: WebSerivceSampler not thread safe
>
> thanks for the patch, i'll take a look this weekend when I get a
> chance. Out of curiousity, what kind of errors are you seeing. I've
> tested and profiled the sampler on several occasions using OptimizeIt
> and wasn't able to see any errors. any additional information you can
> provide would help make sure the bug is really fixed.
>
> thanks
>
> peter
>
> On Mar 31, 2005 9:38 PM, KiYun Roe <ki...@active-endpoints.com> wrote:
> > Hi,
> >
> > There's a comment at about line 108 of
> org.apache.jmeter.protocol.http.sampler.WebServiceSampler.java expressing
> concern that sharing a single DocumentBuilder might not be thread safe.
> Well, it's not. This explains the intermittent, mysterious failures that
> I've seen testing a web service from multiple JMeter threads.
> >
> > Here's a possible patch using a ThreadLocal to allocate one
> DocumentBuilder per thread. I'm new to Jakarta. How do I get this into the
> source distribution?
> >
> > Thanks.
> >
> > -- KiYun Roe
> >
> > Index:
> src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.
> java
> > ===================================================================
> > RCS file:
> /home/cvspublic/jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/
> http/sampler/WebServiceSampler.java,v
> > retrieving revision 1.17
> > diff -b -u -w -r1.17 WebServiceSampler.java
> > ---
> src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.
> java 6 Jan 2005 01:11:43 -0000 1.17
> > +++
> src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.
> java 1 Apr 2005 02:16:39 -0000
> > @@ -112,7 +112,14 @@
> > * consider using Apache commons pool to create a pool of document
> builders
> > * or make sure XMLParserUtils creates builders efficiently.
> > */
> > - private static DocumentBuilder XDB = null;
> > + private static ThreadLocal ThreadLocalXDB =
> > + new ThreadLocal()
> > + {
> > + protected Object initialValue()
> > + {
> > + return XMLParserUtils.getXMLDocBuilder();
> > + }
> > + };
> >
> > private String FILE_CONTENTS = null;
> >
> > @@ -413,10 +420,7 @@
> > */
> > protected Document openDocument(String key)
> > {
> > - if (XDB == null)
> > - {
> > - XDB = XMLParserUtils.getXMLDocBuilder();
> > - }
> > + DocumentBuilder XDB = (DocumentBuilder)
> ThreadLocalXDB.get();
> > Document doc = null;
> > // if either a file or path location is given,
> > // get the file object.
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
> > For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org
> >
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org
RE: WebSerivceSampler not thread safe
Posted by KiYun Roe <ki...@active-endpoints.com>.
Sure. The errors I saw manifested themselves as unsuccessful results in View
Results Tree, etc. The statement
openDocument(null).getDocumentElement();
at about line 405 in WebServiceSampler.jar was throwing a null pointer
exception, because the call to XDB.parse() was failing inside openDocument()
(because document builders are not thread safe). The null pointer exception
was caught at line 595 of WebServiceSampler.java, resulting in a call to
RESULT.setSuccessful(false)--hence, the unsuccessful result.
I personally found it easier to reproduce the problem by hitting a very
simple web service on another machine from a basic multi-threaded test plan.
I guess the key is to spend as little time as possible invoking the web
service, so that proportionally more time is spent preparing the call--thus
increasing the odds of finding more than one thread in the problematic code.
I have to say that I'm mystified by the practice of catching exceptions and
failing silently as demonstrated in openDocument(). I hope that's just
temporary.
-- KiYun
-----Original Message-----
From: Peter Lin [mailto:woolfel@gmail.com]
Sent: Thursday, March 31, 2005 10:53 PM
To: JMeter Developers List
Subject: Re: WebSerivceSampler not thread safe
thanks for the patch, i'll take a look this weekend when I get a
chance. Out of curiousity, what kind of errors are you seeing. I've
tested and profiled the sampler on several occasions using OptimizeIt
and wasn't able to see any errors. any additional information you can
provide would help make sure the bug is really fixed.
thanks
peter
On Mar 31, 2005 9:38 PM, KiYun Roe <ki...@active-endpoints.com> wrote:
> Hi,
>
> There's a comment at about line 108 of
org.apache.jmeter.protocol.http.sampler.WebServiceSampler.java expressing
concern that sharing a single DocumentBuilder might not be thread safe.
Well, it's not. This explains the intermittent, mysterious failures that
I've seen testing a web service from multiple JMeter threads.
>
> Here's a possible patch using a ThreadLocal to allocate one
DocumentBuilder per thread. I'm new to Jakarta. How do I get this into the
source distribution?
>
> Thanks.
>
> -- KiYun Roe
>
> Index:
src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.
java
> ===================================================================
> RCS file:
/home/cvspublic/jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/
http/sampler/WebServiceSampler.java,v
> retrieving revision 1.17
> diff -b -u -w -r1.17 WebServiceSampler.java
> ---
src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.
java 6 Jan 2005 01:11:43 -0000 1.17
> +++
src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.
java 1 Apr 2005 02:16:39 -0000
> @@ -112,7 +112,14 @@
> * consider using Apache commons pool to create a pool of document
builders
> * or make sure XMLParserUtils creates builders efficiently.
> */
> - private static DocumentBuilder XDB = null;
> + private static ThreadLocal ThreadLocalXDB =
> + new ThreadLocal()
> + {
> + protected Object initialValue()
> + {
> + return XMLParserUtils.getXMLDocBuilder();
> + }
> + };
>
> private String FILE_CONTENTS = null;
>
> @@ -413,10 +420,7 @@
> */
> protected Document openDocument(String key)
> {
> - if (XDB == null)
> - {
> - XDB = XMLParserUtils.getXMLDocBuilder();
> - }
> + DocumentBuilder XDB = (DocumentBuilder)
ThreadLocalXDB.get();
> Document doc = null;
> // if either a file or path location is given,
> // get the file object.
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org
Re: WebSerivceSampler not thread safe
Posted by Peter Lin <wo...@gmail.com>.
thanks for the patch, i'll take a look this weekend when I get a
chance. Out of curiousity, what kind of errors are you seeing. I've
tested and profiled the sampler on several occasions using OptimizeIt
and wasn't able to see any errors. any additional information you can
provide would help make sure the bug is really fixed.
thanks
peter
On Mar 31, 2005 9:38 PM, KiYun Roe <ki...@active-endpoints.com> wrote:
> Hi,
>
> There's a comment at about line 108 of org.apache.jmeter.protocol.http.sampler.WebServiceSampler.java expressing concern that sharing a single DocumentBuilder might not be thread safe. Well, it's not. This explains the intermittent, mysterious failures that I've seen testing a web service from multiple JMeter threads.
>
> Here's a possible patch using a ThreadLocal to allocate one DocumentBuilder per thread. I'm new to Jakarta. How do I get this into the source distribution?
>
> Thanks.
>
> -- KiYun Roe
>
> Index: src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.java
> ===================================================================
> RCS file: /home/cvspublic/jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.java,v
> retrieving revision 1.17
> diff -b -u -w -r1.17 WebServiceSampler.java
> --- src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.java 6 Jan 2005 01:11:43 -0000 1.17
> +++ src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.java 1 Apr 2005 02:16:39 -0000
> @@ -112,7 +112,14 @@
> * consider using Apache commons pool to create a pool of document builders
> * or make sure XMLParserUtils creates builders efficiently.
> */
> - private static DocumentBuilder XDB = null;
> + private static ThreadLocal ThreadLocalXDB =
> + new ThreadLocal()
> + {
> + protected Object initialValue()
> + {
> + return XMLParserUtils.getXMLDocBuilder();
> + }
> + };
>
> private String FILE_CONTENTS = null;
>
> @@ -413,10 +420,7 @@
> */
> protected Document openDocument(String key)
> {
> - if (XDB == null)
> - {
> - XDB = XMLParserUtils.getXMLDocBuilder();
> - }
> + DocumentBuilder XDB = (DocumentBuilder) ThreadLocalXDB.get();
> Document doc = null;
> // if either a file or path location is given,
> // get the file object.
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org
Re: WebSerivceSampler not thread safe
Posted by Peter Lin <wo...@gmail.com>.
thank you for discovering the bug and reporting it.
peter
On Apr 4, 2005 4:50 PM, KiYun Roe <ki...@active-endpoints.com> wrote:
> Works great. Thanks!
>
> -----Original Message-----
> From: Peter Lin [mailto:woolfel@gmail.com]
> Sent: Saturday, April 02, 2005 3:14 PM
> To: JMeter Developers List
> Subject: Re: WebSerivceSampler not thread safe
>
> I've patched the bug my making the document builder non static. please
> give it a try.
>
> thanks again for reporting it.
>
> peter lin
>
> On Mar 31, 2005 9:38 PM, KiYun Roe <ki...@active-endpoints.com> wrote:
> > Hi,
> >
> > There's a comment at about line 108 of
> org.apache.jmeter.protocol.http.sampler.WebServiceSampler.java expressing
> concern that sharing a single DocumentBuilder might not be thread safe.
> Well, it's not. This explains the intermittent, mysterious failures that
> I've seen testing a web service from multiple JMeter threads.
> >
> > Here's a possible patch using a ThreadLocal to allocate one
> DocumentBuilder per thread. I'm new to Jakarta. How do I get this into the
> source distribution?
> >
> > Thanks.
> >
> > -- KiYun Roe
> >
> > Index:
> src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.
> java
> > ===================================================================
> > RCS file:
> /home/cvspublic/jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/
> http/sampler/WebServiceSampler.java,v
> > retrieving revision 1.17
> > diff -b -u -w -r1.17 WebServiceSampler.java
> > ---
> src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.
> java 6 Jan 2005 01:11:43 -0000 1.17
> > +++
> src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.
> java 1 Apr 2005 02:16:39 -0000
> > @@ -112,7 +112,14 @@
> > * consider using Apache commons pool to create a pool of document
> builders
> > * or make sure XMLParserUtils creates builders efficiently.
> > */
> > - private static DocumentBuilder XDB = null;
> > + private static ThreadLocal ThreadLocalXDB =
> > + new ThreadLocal()
> > + {
> > + protected Object initialValue()
> > + {
> > + return XMLParserUtils.getXMLDocBuilder();
> > + }
> > + };
> >
> > private String FILE_CONTENTS = null;
> >
> > @@ -413,10 +420,7 @@
> > */
> > protected Document openDocument(String key)
> > {
> > - if (XDB == null)
> > - {
> > - XDB = XMLParserUtils.getXMLDocBuilder();
> > - }
> > + DocumentBuilder XDB = (DocumentBuilder)
> ThreadLocalXDB.get();
> > Document doc = null;
> > // if either a file or path location is given,
> > // get the file object.
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org
RE: WebSerivceSampler not thread safe
Posted by KiYun Roe <ki...@active-endpoints.com>.
Works great. Thanks!
-----Original Message-----
From: Peter Lin [mailto:woolfel@gmail.com]
Sent: Saturday, April 02, 2005 3:14 PM
To: JMeter Developers List
Subject: Re: WebSerivceSampler not thread safe
I've patched the bug my making the document builder non static. please
give it a try.
thanks again for reporting it.
peter lin
On Mar 31, 2005 9:38 PM, KiYun Roe <ki...@active-endpoints.com> wrote:
> Hi,
>
> There's a comment at about line 108 of
org.apache.jmeter.protocol.http.sampler.WebServiceSampler.java expressing
concern that sharing a single DocumentBuilder might not be thread safe.
Well, it's not. This explains the intermittent, mysterious failures that
I've seen testing a web service from multiple JMeter threads.
>
> Here's a possible patch using a ThreadLocal to allocate one
DocumentBuilder per thread. I'm new to Jakarta. How do I get this into the
source distribution?
>
> Thanks.
>
> -- KiYun Roe
>
> Index:
src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.
java
> ===================================================================
> RCS file:
/home/cvspublic/jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/
http/sampler/WebServiceSampler.java,v
> retrieving revision 1.17
> diff -b -u -w -r1.17 WebServiceSampler.java
> ---
src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.
java 6 Jan 2005 01:11:43 -0000 1.17
> +++
src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.
java 1 Apr 2005 02:16:39 -0000
> @@ -112,7 +112,14 @@
> * consider using Apache commons pool to create a pool of document
builders
> * or make sure XMLParserUtils creates builders efficiently.
> */
> - private static DocumentBuilder XDB = null;
> + private static ThreadLocal ThreadLocalXDB =
> + new ThreadLocal()
> + {
> + protected Object initialValue()
> + {
> + return XMLParserUtils.getXMLDocBuilder();
> + }
> + };
>
> private String FILE_CONTENTS = null;
>
> @@ -413,10 +420,7 @@
> */
> protected Document openDocument(String key)
> {
> - if (XDB == null)
> - {
> - XDB = XMLParserUtils.getXMLDocBuilder();
> - }
> + DocumentBuilder XDB = (DocumentBuilder)
ThreadLocalXDB.get();
> Document doc = null;
> // if either a file or path location is given,
> // get the file object.
---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org
Re: WebSerivceSampler not thread safe
Posted by Peter Lin <wo...@gmail.com>.
I've patched the bug my making the document builder non static. please
give it a try.
thanks again for reporting it.
peter lin
On Mar 31, 2005 9:38 PM, KiYun Roe <ki...@active-endpoints.com> wrote:
> Hi,
>
> There's a comment at about line 108 of org.apache.jmeter.protocol.http.sampler.WebServiceSampler.java expressing concern that sharing a single DocumentBuilder might not be thread safe. Well, it's not. This explains the intermittent, mysterious failures that I've seen testing a web service from multiple JMeter threads.
>
> Here's a possible patch using a ThreadLocal to allocate one DocumentBuilder per thread. I'm new to Jakarta. How do I get this into the source distribution?
>
> Thanks.
>
> -- KiYun Roe
>
> Index: src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.java
> ===================================================================
> RCS file: /home/cvspublic/jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.java,v
> retrieving revision 1.17
> diff -b -u -w -r1.17 WebServiceSampler.java
> --- src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.java 6 Jan 2005 01:11:43 -0000 1.17
> +++ src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.java 1 Apr 2005 02:16:39 -0000
> @@ -112,7 +112,14 @@
> * consider using Apache commons pool to create a pool of document builders
> * or make sure XMLParserUtils creates builders efficiently.
> */
> - private static DocumentBuilder XDB = null;
> + private static ThreadLocal ThreadLocalXDB =
> + new ThreadLocal()
> + {
> + protected Object initialValue()
> + {
> + return XMLParserUtils.getXMLDocBuilder();
> + }
> + };
>
> private String FILE_CONTENTS = null;
>
> @@ -413,10 +420,7 @@
> */
> protected Document openDocument(String key)
> {
> - if (XDB == null)
> - {
> - XDB = XMLParserUtils.getXMLDocBuilder();
> - }
> + DocumentBuilder XDB = (DocumentBuilder) ThreadLocalXDB.get();
> Document doc = null;
> // if either a file or path location is given,
> // get the file object.
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org