Как контролировать порядок выполнения операторов exec в сценарии Гатлинга?

В следующем фрагменте кода я хочу, чтобы функция сеанса выполнялась перед HttpRequestbBuilder SolrProductionDataRequestBuilder, но я не могу это сделать... Относительно новый для Scala и Gatling, поэтому, пожалуйста, простите здесь вопиющую ошибку... (Мне нужно изменить ключи сеанса, чтобы сделать их приемлемыми для Solr, прежде чем добавлять их в http-запрос — Solr разрешает (требует) дублировать ключи.Запросы Solr (полученные из журнала Splunk) считываются в сеанс с помощью фидера tsv)

  var scn = scenario("Solr load scenario using production solr request traffic")
    .feed(queryParameterFeeder)
    .exec(session => {
      duplicateGatlingSessionMap(session.attributes)
      session
    })
    .exec(
      SolrProductionDataRequestBuilder("wow", gatlingSessionMap)
        .build()
        .asJSON
        .check(status.is(200))
    )
   .pause(3000 milliseconds, 5000 milliseconds) 

person Grubbie1    schedule 19.02.2016    source источник
comment
Вам нужно вытащить вызов из блока exec и вставить его в статический код, скажем, сразу после var scn. Эти блоки .exec выполняются параллельно.   -  person Prune    schedule 20.02.2016
comment
Нет, блоки exec выполняются последовательно для данного виртуального пользователя.   -  person Stephane Landelle    schedule 20.02.2016


Ответы (2)


Из документа Session API:

Экземпляры сеанса неизменяемы!

Я не знаю, что делает ваш duplicateGatlingSessionMap, но ваш exec(function) возвращает только исходный сеанс.

Примечание: не используйте var, используйте val. Нет причин использовать переназначаемые ссылки.

person Stephane Landelle    schedule 19.02.2016

Как уже упоминал Стефан, «сеансы» неизменяемы, т.е. в вашем первом exec() вы не возвращаете измененный сеанс. В противном случае поток операторов exec() соответствует написанному в коде, следовательно, в определенной последовательности.

Не уверен, что делает ваш код, но предпочтительный/идиоматический способ - написать его так:

def duplicateGatlingSessionMap(session: Session) Session = {
  // your session modification logic here
}

val scn = scenario("Solr load scenario using production solr request traffic")
  .feed(queryParameterFeeder)
  .exec( session => // above defined function which modifies the session and returns it back
    duplicateGatlingSessionMap(session) 
  ) 
  .exec(
  SolrProductionDataRequestBuilder("wow", gatlingSessionMap)
      .build()
      .asJSON
      .check(status.is(200))
  )
  .pause(3000 milliseconds, 5000 milliseconds) 

Надеюсь это поможет.

Изменить: см. комментарии

person Teliatko    schedule 19.02.2016
comment
Нет, это неправильно. Создание ActionBuilder или Action во время выполнения в функции бессмысленно: он не привязан к остальной части цепочки сценариев, которая уже статически создана во время загрузки. - person Stephane Landelle; 20.02.2016
comment
Не уверен, что понимаю. В моем примере я просто вызываю функцию в exec, которая изменяет сеанс, то есть возвращает измененную копию. Какая ИМО в порядке. - person Teliatko; 20.02.2016
comment
См. stackoverflow.com/questions/35480244/ - person Stephane Landelle; 20.02.2016
comment
Соответственно отредактировал мой ответ .. Извините за путаницу - person Teliatko; 20.02.2016
comment
Нет про. Спасибо, что помогли ответить :) - person Stephane Landelle; 20.02.2016