sman
sman

Reputation: 85

crafting the body for request does not work concurrently

I would like to send simultaneous requests through gatlings for some duration below is the snippet of my code where I am crafting the requests. JSON file contents function which is used for crafting the json. its been used in the main request the TestDevice_dev.csv has list of devices till 30 after 30 I will reuse it. TestDevice1 TestDevice2 TestDevice3 . . . val dFeeder = csv("TestDevice_dev.csv").circular

val trip_dte_tunnel_1 = scenario("TripSimulation")
        .feed(dFeeder)
        .exec(session => {
         val key = conf.getString("config.env.sign_key")
         var bodyTrip = CannedRequests.jsonFileContents("${deviceID}")
         //deviceId comes from the feeder
         session.set("trip_sign", SignatureGeneration.getSignature(key, bodyTrip))
         session.set("tripBody",bodyTrip)
         })
        .exec(http("trip")
           .post(trip_url)
           .headers(trip_Headers_withsign)
           .body(StringBody("${tripBody}")).asJSON.check(status.is(201)))    
        .exec(flushSessionCookies)
the scenario is started as below 
val scn_trip = scenario("trip simulation")
    .repeat{1} {
      
      exec(DataExchange.trip_dte_tunnel_1)
   
    }
  setUp(scn_trip.inject(constantUsersPerSec(5)  during (5 seconds))) ```

it runs fine if there is 1 user for 5 seconds but not simulatenous users.

the json request which is crafted looks like the below

   "events":[
      {
         "deviceDetailsDataModel":{
            "deviceId":"<deviceID>"
         },
         "eventDateTime":"<timeStamp>",
         "tripInfoDataModel":{
            "ignitionStatus":"ON",
            "ignitionONTime":"<onTimeStamp>"
         }
      },
      {
         "deviceDetailsDataModel":{
            "deviceId":"<deviceID>"
         },
         "eventDateTime":"<timeStamp>",
         "tripInfoDataModel":{
            "ignitionStatus":"ON",
            "ignitionONTime":"<onTimeStamp>"
         }
      },
      {
         "deviceDetailsDataModel":{
            "deviceId":"<deviceID>"
         },
         "eventDateTime":"<timeStamp>",
         "tripInfoDataModel":{
            "ignitionOFFTime":"<onTimeStamp>",
            "ignitionStatus":"OFF"
         }
      }
   ]
}`


    `def jsonFileContents(deviceId: String): String= {
    val fileName = "trip-data.json"
    var stringBuilder=""
    var timeStamp1:Long = ZonedDateTime.now(ZoneId.of("America/Chicago")).toInstant().toEpochMilli().toLong - 10000.toLong
    for (line <- (Source fromFile fileName).getLines) {
      if (line.contains("eventDateTime")) {
        var lineReplace=line.replaceAll("<timeStamp>", timeStamp1.toString())
        stringBuilder=stringBuilder+lineReplace
        timeStamp1 = timeStamp1+1000.toLong
      }
      else if (line.contains("onTimeStamp")) {
        var lineReplace1=line.replaceAll("<onTimeStamp>", timeStamp1.toString)
        stringBuilder=stringBuilder+lineReplace1
      }
      else if (line.contains("deviceID")){
        var lineReplace2=line.replace("<deviceID>", deviceId)
        stringBuilder=stringBuilder+lineReplace2
      }
      else {
        stringBuilder =stringBuilder+line
      }
    }
    stringBuilder
  }
`

Upvotes: 0

Views: 122

Answers (2)

James Warr
James Warr

Reputation: 2604

You don't need to do your own parameter substitution of values in the json file - Gatling supports passing en ELFileBody as the body where you can have a json file with gatling EL expressions like ${deviceId}.

Upvotes: 0

St&#233;phane LANDELLE
St&#233;phane LANDELLE

Reputation: 6623

Best guess: your feeder contains one single entry and you're using the default queue strategy. Either add more entries in your feeder file to match the number of users, or use a different strategy.

This really is explained in the documentation, including the tutorials. I recommend you take some time to read the documentation before rushing into the code, you'll save lots of time in the end.

Upvotes: 1

Related Questions