Hi,
I am using an iterator of AtomicLong to generate transactionid of different requests.
Issue is , it is arbirarily stopping as “Feeder is now empty”.
Similar Approach with scala test suite is working fine.
To simulate the script , I am running a Jmeter Mirror server and just posting dummy messages.
I am providing the simplified script here :
package test;
import io.gatling.javaapi.core.ScenarioBuilder;
import io.gatling.javaapi.core.Simulation;
import io.gatling.javaapi.http.HttpProtocolBuilder;
import java.time.Duration;
import java.util.Collections;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;
import java.util.function.Supplier;
import java.util.stream.Stream;
import static io.gatling.javaapi.core.CoreDsl.*;
import static io.gatling.javaapi.http.HttpDsl.http;
public class testSimulation extends Simulation {
// Declared Variables
private final String baseURL = "http://localhost:9090";
private final AtomicLong transactionId = new AtomicLong(10000000000000L);
private final int duration = 5;
private final int executionTime = duration * 4;
private final int maxThroughput = 100;
private final int maxUser = 100;
private final double pct_transaction1 = 0.75;
private final double pct_transaction2 = 0.25;
private final HttpProtocolBuilder httpProtocol = http
.baseUrl(baseURL)
.warmUp(baseURL)
// .disableWarmUp()
// .proxy(Proxy("localhost", 8888))
.acceptHeader("text/html")
.acceptEncodingHeader("gzip,deflate")
.contentTypeHeader("text/xml;charset=UTF-8")
.userAgentHeader("Apache-HttpClient/4.5.5 (Java/16.0.1)");
Iterator<Map<String, Object>> sourceTransactionIdfeed =
Stream.generate((Supplier<Map<String, Object>>) () -> {
String trId = Long.toString(transactionId.getAndIncrement());
return Collections.singletonMap("sourceTransactionId", trId);
}
).iterator();
private final ScenarioBuilder transaction_1 = scenario("transaction1")
.feed(sourceTransactionIdfeed)
.exec(
http("transaction1")
.post("/services/ws/transaction1")
.body(StringBody("#{sourceTransactionId}"))
);
private final ScenarioBuilder transaction_2 = scenario("transaction2")
.feed(sourceTransactionIdfeed)
.exec(
http("transaction2")
.post("/services/ws/transaction2")
.body(StringBody("#{sourceTransactionId}"))
);
private final int usr_tr1 = (int) Math.ceil(maxUser * pct_transaction1);
private final int usr_tr2 = (int) Math.ceil(maxUser * pct_transaction2);
private final int load_tr1 = (int) Math.ceil(maxThroughput * pct_transaction1 / 4);
private final int load_tr2 = (int) Math.ceil(maxThroughput * pct_transaction2 / 4);
{
setUp(
transaction_1.injectClosed(constantConcurrentUsers(usr_tr1).during(Duration.ofMinutes(executionTime)))
.throttle(
jumpToRps(load_tr1), holdFor(Duration.ofMinutes(duration)),
jumpToRps(load_tr1 * 2), holdFor(Duration.ofMinutes(duration)),
jumpToRps(load_tr1 * 3), holdFor(Duration.ofMinutes(duration)),
jumpToRps(load_tr1 * 4), holdFor(Duration.ofMinutes(duration))
),
transaction_2.injectClosed(constantConcurrentUsers(usr_tr2).during(Duration.ofMinutes(executionTime)))
.throttle(
jumpToRps(load_tr2), holdFor(Duration.ofMinutes(duration)),
jumpToRps(load_tr2 * 2), holdFor(Duration.ofMinutes(duration)),
jumpToRps(load_tr2 * 3), holdFor(Duration.ofMinutes(duration)),
jumpToRps(load_tr2 * 4), holdFor(Duration.ofMinutes(duration))
)
).protocols(httpProtocol);
}
}