Resetting rendezvous counter in a loop

I’ve had a look around and can’t find an answer to this (though I did find unanswered questions from about 2 years ago.

What I want to do is have users rendezvous at the same place for every iteration through a loop. So this:

`

var scn = scenario(“Experiment”)
.feed(user) // username
.repeat(2, “LoopCounter”) {
rendezVous(2)
.exec(session => {
println("Loop: " + session(“LoopCounter”).as[String] + " Step 1, username: " + session(“username”).as[String])
session
})
.exec(session => {
println("Loop: " + session(“LoopCounter”).as[String] + " Step 2, username: " + session(“username”).as[String])
session
})
.rendezVous(2)
.exec(session => {
println("Loop: " + session(“LoopCounter”).as[String] + " Step 3, username: " + session(“username”).as[String])
session
})
}

setUp(scn.inject(atOnceUsers(2)).protocols(…))

`

might output:

Loop: 0 Step 1, username: User1
Loop: 0 Step 2, username: User1
Loop: 0 Step 1, username: User2
Loop: 0 Step 2, username: User2
Loop: 0 Step 3, username: User1
Loop: 0 Step 3, username: User2
Loop: 1 Step 1, username: User1
Loop: 1 Step 1, username: User2
Loop: 1 Step 2, username: User1
Loop: 1 Step 2, username: User2
Loop: 1 Step 3, username: User1 ← rendezvous on the second loop is respected
Loop: 1 Step 3, username: User2

but what I might get is:

`

Loop: 0 Step 1, username: User1
Loop: 0 Step 2, username: User1
Loop: 0 Step 1, username: User2
Loop: 0 Step 2, username: User2
Loop: 0 Step 3, username: User1
Loop: 0 Step 3, username: User2
Loop: 1 Step 1, username: User1
Loop: 1 Step 2, username: User1
Loop: 1 Step 3, username: User1 ← rendezvous is not respected
Loop: 1 Step 1, username: User2
Loop: 1 Step 2, username: User2
Loop: 1 Step 3, username: User2

`

I came up with a solution that seems a little convoluted, which increases a target at each iteration, essentially shifting the rendezvous value by the number of users. The downside is I need to define a separate counter for each rendezvous spot I want.

`

val count = new AtomicInteger
val count2 = new AtomicInteger
val loop = new AtomicInteger
val target = new AtomicInteger

def myRendezVous(counter: AtomicInteger) = {

exec( session => {
counter.getAndIncrement
session
})
.asLongAs(session => { (counter.get < target.get) && (loop.get == session(“LoopCounter”).as[Int]) }) {
pause(1)
}
}

var scn = scenario(“Experiment”)
.feed(user) // username
.repeat(2, “LoopCounter”) {
exec( session => {
target.set((session(“LoopCounter”).as[Int] + 1) * 2)
loop.set(session(“LoopCounter”).as[Int])
session
})
.exec(myRendezVous(count))
.exec(session => {
println("Loop: " + session(“LoopCounter”).as[String] + " Step 1, username: " + session(“username”).as[String])
session
})
.exec(session => {
println("Loop: " + session(“LoopCounter”).as[String] + " Step 2, username: " + session(“username”).as[String])
session
})
.exec(myRendezVous(count2))
.exec(session => {
println("Loop: " + session(“LoopCounter”).as[String] + " Step 3, username: " + session(“username”).as[String])
session
})
}

setUp(scn.inject(atOnceUsers(2)).protocols(…))

`

Anyone know of a better solution?