You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@jmeter.apache.org by prasanna bhat <pr...@gmail.com> on 2010/05/08 15:18:33 UTC
Thread Synchronization
Hi,
I have interesting use case in which the value of a given variable has to be
compared across threads. I will try my best to illustrate it below.
TestPlan
+ThreadGroup ( 5threads, 2loops)
++Http sampler 1 (This sampler will fetch all the requests that are
waiting for approval)
+++ BSF Post Processor 1
++ Http Sampler 2 (The sampler sends the request id which has to be
approved)
+++ BSF Post Processor 2
The response of Http sampler 1 will contain a list of ids of the requests to
be approved. I'm fetching the first request id and sending it as a parameter
to Http Sampler 2 for approval.
The problem occurs when the 1st thread has picked a certain request id (say
request id 1101) and send it as a parameter to Http Sampler 2 for approval,
but before this request has been approved the second thread gets active and
send a http request (Http Sampler 1) and receives all the request ids to be
approved as a response, therefore the second thread also sees request id
1101 (Since it has not been approved yet) and picks it up for approval i.e.
the same request id is passed to Http Sampler 2 for second thread also. Now
there is clash of multiple threads trying to approve the same request and
the server responds with an error.
So my question is, how do I ensure different threads pick different request
id (i.e one that is not picked up by any of the other active threads)??
Please let me know if I have to make it more clearer.
Thanks,
Prasanna
Re: Thread Synchronization
Posted by prasanna bhat <pr...@gmail.com>.
Hi Deepak,
>> by loading the string form of all the ids into properties object , where
based on the thread number one gets picked
Well in the beginning I tried using the setproperty() and __P() functions to
set and get the request Ids. I observed some weird errors.
I used WRS_Property to set the Request Ids which were chosen for approval
and I initially set it to 0 in the test plan.
+ThreadGroup ( 5threads, 2loops)
++Http sampler 1 (This sampler will fetch all the requests that are
waiting for approval)
+++ BSF Post Processor 1
[
Var prevRequestId=read WRS_Property;
If WRS_Property is 0
Then select the first
request id
Else
Loop:
Generate a
random number and get the request Id corresponding to that random number.
If this
request Id is not same as prevRequestId
Break;
Vars.put(“curRequestId”,
selectedRequestId);
]
++ Http Sampler 2 (The sampler sends the request id which has to be
approved)
+++ BSF Post Processor 2
[
Var requestIdList=read WRS_Property;
If requestIdList is 0
Set WRS_Property to current
request Id
Else
Set
WRS_Property=requestIdList+”;”+vars.get(currentRequestId);
]
With this script in place I got the output to be
--------------------------------------------------------------
Prev WRS id: 0
Cur WRS id150399
RequestId Set To: 150399
--------------------------------------------------------------
Prev WRS id: undefined;150399
Found curRequestId: 150399
RequestId Set To: undefined;150399;150399
--------------------------------------------------------------
Prev WRS id: undefined;null
Found curRequestId: null
RequestId Set To: undefined;null;null
--------------------------------------------------------------
Prev WRS id: undefined;null
Found curRequestId: null
RequestId Set To: undefined;null;null
I’m not able to figure out why is this happening.
I have also attached the code in the BSF post processor 1 and BSF post
processor 2 in the mail.
In the mean time I will try other options you have pointed out.
Thanks for your time.
Regards,
Prasanna
On Sat, May 8, 2010 at 9:32 PM, Deepak Shetty <sh...@gmail.com> wrote:
> Hi
> If it isnt possible to choose a simple scheme (like map a thread number to
> the id picked i.e. thread1 always picks first id , thread 2 picks second
> id)
>
> or by loading the string form of all the ids into properties object , where
> based on the thread number one gets picked
>
> then you'd have to either
> split the fetching of ids separate to the approval process
> Thread Group 1
> +Sampler 1
> ++Write all ids to CSV
> Thread Group 2
> +Sampler 2
> ++CSV DataSet Config
>
> Its also possible to combine the two thread groups into one (this needs
> some
> custom java code)
> Thread Group
> +Sampler1
> ++Each writes to their own CSV
> +Ensure only one thread writes a combined file , while the rest wait
> +Sampler 2
> CSV Data Set Config
>
> or some custom java object which allows concurrent access and can keep a
> list of ids fetched(static) and hand out a different one to whoever
> requests it
>
> regards
> deepak
>
>
> On Sat, May 8, 2010 at 6:18 AM, prasanna bhat <prasannabhat38@gmail.com
> >wrote:
>
> > Hi,
> >
> > I have interesting use case in which the value of a given variable has to
> > be
> > compared across threads. I will try my best to illustrate it below.
> >
> > TestPlan
> > +ThreadGroup ( 5threads, 2loops)
> > ++Http sampler 1 (This sampler will fetch all the requests that are
> > waiting for approval)
> > +++ BSF Post Processor 1
> > ++ Http Sampler 2 (The sampler sends the request id which has to be
> > approved)
> > +++ BSF Post Processor 2
> >
> > The response of Http sampler 1 will contain a list of ids of the requests
> > to
> > be approved. I'm fetching the first request id and sending it as a
> > parameter
> > to Http Sampler 2 for approval.
> >
> > The problem occurs when the 1st thread has picked a certain request id
> (say
> > request id 1101) and send it as a parameter to Http Sampler 2 for
> approval,
> > but before this request has been approved the second thread gets active
> and
> > send a http request (Http Sampler 1) and receives all the request ids to
> be
> > approved as a response, therefore the second thread also sees request id
> > 1101 (Since it has not been approved yet) and picks it up for approval
> i.e.
> > the same request id is passed to Http Sampler 2 for second thread also.
> > Now
> > there is clash of multiple threads trying to approve the same request and
> > the server responds with an error.
> >
> >
> >
> > So my question is, how do I ensure different threads pick different
> request
> > id (i.e one that is not picked up by any of the other active threads)??
> >
> >
> >
> > Please let me know if I have to make it more clearer.
> >
> >
> >
> > Thanks,
> >
> > Prasanna
> >
>
Re: Thread Synchronization
Posted by Deepak Shetty <sh...@gmail.com>.
Hi
If it isnt possible to choose a simple scheme (like map a thread number to
the id picked i.e. thread1 always picks first id , thread 2 picks second id)
or by loading the string form of all the ids into properties object , where
based on the thread number one gets picked
then you'd have to either
split the fetching of ids separate to the approval process
Thread Group 1
+Sampler 1
++Write all ids to CSV
Thread Group 2
+Sampler 2
++CSV DataSet Config
Its also possible to combine the two thread groups into one (this needs some
custom java code)
Thread Group
+Sampler1
++Each writes to their own CSV
+Ensure only one thread writes a combined file , while the rest wait
+Sampler 2
CSV Data Set Config
or some custom java object which allows concurrent access and can keep a
list of ids fetched(static) and hand out a different one to whoever
requests it
regards
deepak
On Sat, May 8, 2010 at 6:18 AM, prasanna bhat <pr...@gmail.com>wrote:
> Hi,
>
> I have interesting use case in which the value of a given variable has to
> be
> compared across threads. I will try my best to illustrate it below.
>
> TestPlan
> +ThreadGroup ( 5threads, 2loops)
> ++Http sampler 1 (This sampler will fetch all the requests that are
> waiting for approval)
> +++ BSF Post Processor 1
> ++ Http Sampler 2 (The sampler sends the request id which has to be
> approved)
> +++ BSF Post Processor 2
>
> The response of Http sampler 1 will contain a list of ids of the requests
> to
> be approved. I'm fetching the first request id and sending it as a
> parameter
> to Http Sampler 2 for approval.
>
> The problem occurs when the 1st thread has picked a certain request id (say
> request id 1101) and send it as a parameter to Http Sampler 2 for approval,
> but before this request has been approved the second thread gets active and
> send a http request (Http Sampler 1) and receives all the request ids to be
> approved as a response, therefore the second thread also sees request id
> 1101 (Since it has not been approved yet) and picks it up for approval i.e.
> the same request id is passed to Http Sampler 2 for second thread also.
> Now
> there is clash of multiple threads trying to approve the same request and
> the server responds with an error.
>
>
>
> So my question is, how do I ensure different threads pick different request
> id (i.e one that is not picked up by any of the other active threads)??
>
>
>
> Please let me know if I have to make it more clearer.
>
>
>
> Thanks,
>
> Prasanna
>