tinkoff / gatling-amqp-plugin Goto Github PK
View Code? Open in Web Editor NEWPlugin for support performance testing with AMQP in Gatling (3.7.x)
License: Apache License 2.0
Plugin for support performance testing with AMQP in Gatling (3.7.x)
License: Apache License 2.0
Thank you :) I am able to publish the message using ElFileBody as below.
Really appreciate the reply. I am getting started with Gatling and facing an another issue. I have seeked help from community as well. It would be really helpful, if you can give some inputs.
package simulations
import io.gatling.core.Predef._
import io.gatling.core.structure.{ChainBuilder, ScenarioBuilder}
import ru.tinkoff.gatling.amqp.Predef._
import ru.tinkoff.gatling.amqp.protocol.AmqpProtocolBuilder
class PublishWithFeeeder extends Simulation{
val csvFeederVINNumber = csv("testData/vinNumber.csv").circular
val amqpConf: AmqpProtocolBuilder = amqp
.connectionFactory(rabbitmq
.host("hasty-whale.rmq.cloudamqp.com")
.port(5672)
.username("username")
.password("password")
.vhost("host"))
.declare(queue("measurement_data_hino_us_pilot_uat",autoDelete = false))
def publishMessageWithFeeder(): ChainBuilder ={
feed(csvFeederVINNumber)
.exec(amqp("publish to us_pilot_uat")
.publish
.queueExchange("measurement_data_hino_us_pilot_uat")
.textMessage(ElFileBody("testData/publish.json"))
.priority(0)
.contentType("application/json"))
.pause(1)
}
val scn: ScenarioBuilder = scenario("Message Publish with Feeder")
.exec(publishMessageWithFeeder())
setUp(
scn.inject(atOnceUsers(1))).protocols(amqpConf)
}
Issue Link : https://stackoverflow.com/questions/66950680/using-timestamp-in-json-file-in-gating
Description :
I have json file in below format
Scenario :
Publishing message into RabbitMQ using Gatling.
I have saved the json file in resource folder.
Passing json file using "ElFileBody" builder.
i have to get the current timestamp and increment current time accordingly in the downstream dapoints. Attached below ex
Could you please help in generating the timestamp, how can we increment/decrement the current timestamps by seconds/minutes/hours/days and pass directly in json file.
{
"series": {
"uid": "60329dd7-cc15-43ca-ac5d-6907126b017a",
"seriesName": "APP",
"valueType": "DOUBLE",
"description": "",
"signalCollectionId": "ed6a6744-32c7-4f96-969c-8e1bd1b26f41",
"sourceId": "70f15369-9ac0-4533-8f49-c7f0326a2a05",
"sourceName": "v7r2_J_ENG_DEC",
"unit": "%",
"protocol": "CAN_RAW",
"type": "SIGNAL",
"samplingRate": 1000
},
"dataPoints": [
{
"uniqueId": "34ad93e0-bdb3-4cbc-8354-ab59a808960f",
"timeStamp": "2021-03-15T13:13:01.111Z", //Current timestamp
"value": 0
},
{
"uniqueId": "f901ec1e-5fd5-4015-97ad-b14aadae17ff",
"timeStamp": "2021-03-15T13:13:11.111Z", //Current timestamp + 10 seconds
"value": 0
},
{
"uniqueId": "abc79341-2388-447c-8bd1-4671c791f9b9",
"timeStamp": "2021-03-15T13:13:21.111Z", //Current timestamp + 20 seconds
"value": 0
}
]
}
Thank you :)
Naveen.
In the file https://github.com/TinkoffCreditSystems/gatling-amqp-plugin/blob/master/src/main/scala/ru/tinkoff/gatling/amqp/client/AmqpConnectionPool.scala there has been the method defined
def close(): Unit = {
if (connection != null) {
channelPool.close()
connection.close()
}
}
If connection has already been closed an com.rabbitmq.client.AlreadyClosedException:
is thrown from rabbitmq client lib.
It would be better to check with if connection has already been closed before close is called.
Hi, getting errors like this then trying to push message to the rabbitmq,
logs say that
21:00:24.685 [GatlingSystem-akka.actor.default-dispatcher-4] DEBUG ru.tinkoff.gatling.amqp.action.Publish - Message sent user=1 AMQPMessageID=some_id
and then:
Simulation amqp completed in 0 seconds 21:00:59.797 [GatlingSystem-akka.actor.default-dispatcher-4] ERROR ru.tinkoff.gatling.amqp.action.Publish - 'amqpPublish-2' crashed on session Session(amqp_vcrt,1,1598464859660,Map(68b63433-52a4-4471-aada-832a039db4af -> 0),0,OK,List(ExitOnCompleteLoopBlock(68b63433-52a4-4471-aada-832a039db4af)),io.gatling.core.protocol.ProtocolComponentsRegistry$$Lambda$447/0x0000000800f3a840@1b7e288a), forwarding to the next one java.io.IOException: null at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:129) | => aat com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:125) at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:147) at com.rabbitmq.client.impl.ChannelN.open(ChannelN.java:133) at com.rabbitmq.client.impl.ChannelManager.createChannel(ChannelManager.java:182) at com.rabbitmq.client.impl.AMQConnection.createChannel(AMQConnection.java:555) at com.rabbitmq.client.impl.recovery.AutorecoveringConnection.createChannel(AutorecoveringConnection.java:165) at ru.tinkoff.gatling.amqp.client.AmqpChannelFactory.create(AmqpChannelFactory.scala:8) at ru.tinkoff.gatling.amqp.client.AmqpChannelFactory.create(AmqpChannelFactory.scala:7) at org.apache.commons.pool2.BasePooledObjectFactory.makeObject(BasePooledObjectFactory.java:58) at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:889) at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:424) at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:349) at ru.tinkoff.gatling.amqp.client.AmqpConnectionPool.channel(AmqpConnectionPool.scala:29) at ru.tinkoff.gatling.amqp.client.WithAmqpChannel.withChannel(WithAmqpChannel.scala:8) at ru.tinkoff.gatling.amqp.client.WithAmqpChannel.withChannel$(WithAmqpChannel.scala:7) at ru.tinkoff.gatling.amqp.client.AmqpPublisher.withChannel(AmqpPublisher.scala:11) at ru.tinkoff.gatling.amqp.client.AmqpPublisher.$anonfun$publish$2(AmqpPublisher.scala:21) at ru.tinkoff.gatling.amqp.client.AmqpPublisher.$anonfun$publish$2$adapted(AmqpPublisher.scala:20) at io.gatling.commons.validation.Success.onSuccess(Validation.scala:49) at io.gatling.commons.validation.Validation.foreach(Validation.scala:35) at io.gatling.commons.validation.Validation.foreach$(Validation.scala:35) at io.gatling.commons.validation.Success.foreach(Validation.scala:44) at ru.tinkoff.gatling.amqp.client.AmqpPublisher.$anonfun$publish$1(AmqpPublisher.scala:20) at ru.tinkoff.gatling.amqp.client.AmqpPublisher.$anonfun$publish$1$adapted(AmqpPublisher.scala:19) at io.gatling.commons.validation.Success.onSuccess(Validation.scala:49) at io.gatling.commons.validation.Validation.foreach(Validation.scala:35) at io.gatling.commons.validation.Validation.foreach$(Validation.scala:35) at io.gatling.commons.validation.Success.foreach(Validation.scala:44) at ru.tinkoff.gatling.amqp.client.AmqpPublisher.publish(AmqpPublisher.scala:19) at ru.tinkoff.gatling.amqp.action.AmqpAction.$anonfun$sendRequest$4(AmqpAction.scala:36) at ru.tinkoff.gatling.amqp.action.AmqpAction.$anonfun$sendRequest$4$adapted(AmqpAction.scala:28) at io.gatling.commons.validation.Success.map(Validation.scala:45) at ru.tinkoff.gatling.amqp.action.AmqpAction.$anonfun$sendRequest$3(AmqpAction.scala:28) at io.gatling.commons.validation.Success.flatMap(Validation.scala:46) at ru.tinkoff.gatling.amqp.action.AmqpAction.$anonfun$sendRequest$1(AmqpAction.scala:25) at io.gatling.commons.validation.Success.flatMap(Validation.scala:46) at ru.tinkoff.gatling.amqp.action.AmqpAction.sendRequest(AmqpAction.scala:24) at io.gatling.core.action.RequestAction.$anonfun$execute$1(Action.scala:100) at io.gatling.commons.validation.Success.flatMap(Validation.scala:46) at io.gatling.core.action.RequestAction.execute(Action.scala:97) at io.gatling.core.action.RequestAction.execute$(Action.scala:96) at ru.tinkoff.gatling.amqp.action.AmqpAction.execute(AmqpAction.scala:12) at io.gatling.core.action.Action.$bang(Action.scala:38) at io.gatling.core.action.Action.$bang$(Action.scala:38) at ru.tinkoff.gatling.amqp.action.AmqpAction.io$gatling$core$action$ChainableAction$$super$$bang(AmqpAction.scala:12) at io.gatling.core.action.ChainableAction.$bang(Action.scala:63) at io.gatling.core.action.ChainableAction.$bang$(Action.scala:61) at ru.tinkoff.gatling.amqp.action.AmqpAction.io$gatling$core$action$ExitableAction$$super$$bang(AmqpAction.scala:12) at io.gatling.core.action.ExitableAction.$bang(BlockExit.scala:141) at io.gatling.core.action.ExitableAction.$bang$(BlockExit.scala:139) at ru.tinkoff.gatling.amqp.action.AmqpAction.$bang(AmqpAction.scala:12) at io.gatling.core.action.InnerLoop.execute(Loop.scala:94) at io.gatling.core.action.Action.$bang(Action.scala:38) at io.gatling.core.action.Action.$bang$(Action.scala:38) at io.gatling.core.action.InnerLoop.io$gatling$core$action$ChainableAction$$super$$bang(Loop.scala:58) at io.gatling.core.action.ChainableAction.$bang(Action.scala:63) at io.gatling.core.action.ChainableAction.$bang$(Action.scala:61) at io.gatling.core.action.InnerLoop.$bang(Loop.scala:58) at io.gatling.core.action.Loop.execute(Loop.scala:54) at io.gatling.core.action.Action.$bang(Action.scala:38) at io.gatling.core.action.Action.$bang$(Action.scala:38) at io.gatling.core.action.Loop.$bang(Loop.scala:25) at io.gatling.core.controller.inject.Workload.startUser(Workload.scala:54) at io.gatling.core.controller.inject.Workload.$anonfun$injectUser$1(Workload.scala:63) at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:41) at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(ForkJoinExecutorConfigurator.scala:49) at akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) at akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) at akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) at akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) Caused by: com.rabbitmq.client.ShutdownSignalException: clean connection shutdown; protocol method: #method<connection.close>(reply-code=200, reply-text=OK, class-id=0, method-id=0) at com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:66) at com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValue(BlockingValueOrException.java:36) at com.rabbitmq.client.impl.AMQChannel$BlockingRpcContinuation.getReply(AMQChannel.java:502) at com.rabbitmq.client.impl.AMQChannel.privateRpc(AMQChannel.java:293) at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:141) ... 68 common frames omitted 21:00:59.798 [GatlingSystem-akka.actor.default-dispatcher-4] DEBUG io.gatling.core.action.Exit - End user #1 21:00:59.798 [GatlingSystem-akka.actor.default-dispatcher-4] DEBUG io.gatling.core.controller.inject.open.OpenWorkload - Start user #1 Parsing log file(s)... 21:00:59.808 [pool-1-thread-1] INFO io.gatling.charts.stats.LogFileReader - Collected ArrayBuffer(/Users/inenashev/Documents/Projects/amqp_vcrt/target/gatling/amqp-20200826180059444/simulation.log) from amqp-20200826180059444 21:00:59.814 [pool-1-thread-1] INFO io.gatling.charts.stats.LogFileReader - First pass 21:00:59.818 [pool-1-thread-1] INFO io.gatling.charts.stats.LogFileReader - First pass done: read 3 lines 21:00:59.824 [pool-1-thread-1] INFO io.gatling.charts.stats.LogFileReader - Second pass 21:00:59.836 [pool-1-thread-1] INFO io.gatling.charts.stats.LogFileReader - Second pass: read 3 lines Parsing log file(s) done Generating reports...
is it me doing something wrong or I just misconfigured my script?
Hello,
I'm trying to execute a Simulation which contains 13 scenarios.
Firstly, I executed the test with 2 simulations, and everything worked as expected, but as soon as I tried to merge the 2 simulations into one, gatling won't start the test.
When I try to launch up to 7 scenarios in the setUp(), it works.
As soon as I put an 8th scenario in the setUp(), gatling stays pending and the simulation never starts.
No logs are written, even if DEBUG mode is enabled in logback.xml
I have to kill the process to make it end.
Below some informations about the code:
setUp(
scnUpdateOMSSendToWorkingOrder.inject(constantUsersPerSec(1) during (60)),
scnIncorrectOMSSendToOrcDeadletter.inject(constantUsersPerSec(1) during (60)),
scnOMSWithoutPrepItemSendToWorkingOrder.inject(constantUsersPerSec(1) during (60)),
scnOMSWithPrepItemSendToWorkingOrder.inject(constantUsersPerSec(1) during (60)),
scnTryToSendMailWithoutFSID.inject(constantUsersPerSec(1) during (60)),
scnReceivedSPLSendConfirmMail.inject(constantUsersPerSec(1) during (60)),
scnSPLCancelMail.inject(constantUsersPerSec(1) during (60)),
scnMetiSplClkOrderSendToMetiOMS.inject(constantUsersPerSec(1) during (60)),
scnMetiSplClkOrderSendToMetiOMSWithDiscount.inject(constantUsersPerSec(1) during (60)),
scnMetiRF604Cancel.inject(constantUsersPerSec(1) during (60)),
scnMetiRF604Ready.inject(constantUsersPerSec(1) during (60)),
scnMetiRF604Prepared.inject(constantUsersPerSec(1) during (60)),
scnMetiRF604IncorrectToDLQ.inject(constantUsersPerSec(1) during (60))
).protocols(amqpConf)
.assertions(
forAll.successfulRequests.percent.gt(90),
forAll.responseTime.percentile3.lte(200)
)
All these scenarios are base on the function below:
def omsScenario(scenarioName: String, exchangeName: String, routeKey: String, replyQueue: String, action: String, filePathMessage: String): ScenarioBuilder = {
val scnMeti: ScenarioBuilder = scenario(scenarioName)
.feed(correlationIds)
.exec(
amqp(scenarioName).requestReply
.directExchange(exchangeName, routeKey)
.replyExchange(replyQueue)
.bytesMessage(RawFileBody(filePathMessage))
.contentType("application/json")
.headers("action" -> action, "correlationId" -> "${correlationId}")
.priority(0)
)
scnMeti
}
Here is the connection configuration:
val amqpConf: AmqpProtocolBuilder = amqp
.connectionFactory(
rabbitmq
.host("my_endpoint")
.port(5672)
.username("user")
.password("pw")
.vhost("/my_vhost")
)
.usePersistentDeliveryMode
.replyTimeout(900000)
.matchByMessage(getMatcher)
Any help would be great. Thank you in advance.
Terry
Hi Community,
I have tried to use different Scala SDK versions. Is it because Protocol.scala is not in this path anymore but instead at io.gatling.core.protocol.Protocol?
Please kindly help me.
Thank you,
Compiling with Zinc Scala compiler.
Prepared Zinc Scala inputs: 0.12 secs
Compiling 28 Scala sources to /home/kevin/IdeaProjects/GatlingPerfFramework/build/classes/scala/gatling ...
[Error] /home/kevin/IdeaProjects/GatlingPerfFramework/src/gatling/simulations/setup/VLS/RabbitMQ_amqpClient.scala:18: Symbol 'type io.gatling.core.config.Protocol' is missing from the classpath.
This symbol is required by 'class io.gatling.amqp.config.AmqpProtocol'.
Make sure that type Protocol is in your classpath and check for conflicting dependencies with -Ylog-classpath
.
A full rebuild may help if 'AmqpProtocol.class' was compiled against an incompatible version of io.gatling.core.config.
[Error] /home/kevin/IdeaProjects/GatlingPerfFramework/src/gatling/simulations/setup/VLS/RabbitMQ_amqpClient.scala:34: overloaded method value protocols with alternatives:
(ps: Iterable[io.gatling.core.protocol.Protocol])RabbitMQ_amqpClient.this.SetUp
(ps: io.gatling.core.protocol.Protocol*)RabbitMQ_amqpClient.this.SetUp
cannot be applied to (io.gatling.amqp.config.AmqpProtocol)
two errors found
I want to load-test our system which is connected via RabbitMQ.Therefore I try this plugin and I am asking myself is this plugin comatible to gatling 3.4.0 or should I use an old version of gatling? If its not compatible are there any plans to make it compatible again?
I get the following exeption if I try this plugin with gatling 3.4.0
java.lang.NoSuchMethodError: io.gatling.core.CoreComponents.throttler()Lio/gatling/core/controller/throttle/Throttler;
Warning: I am neither a scala nor gatling expert.
Hello, Is there any option to add Topic support in your AMQP library?
I'd need to use both, topic and direct but I'm jjust realized that your lib does not have support for Topic :(.
Thx.
Hello,
When I try to run the tests in either of the examples, I get the following error
[error] found : String("testvalue")
[error] required: io.gatling.commons.validation.Validation[Map[String,String]]
[error] .headers(Map("testheader" -> "testvalue"))
Can you please assist?
Thanks,
Jairo
i tried the example provided (RequestReply)
But here it is not acknowledge the message response(hence failing the test), even though i can see all the messages are being consumed from the queue ( rep-queue-mq) by the test suite.
I am not sure what i am missing here, may be some additional check block.i think i miss some kind of comparison or protocol configuration here ( i tried to figure out whether id exists in response with jsonPath("$.id").exists, but its failing in runtime due to
type mismatch;
found : io.gatling.core.check.CheckBuilder[io.gatling.core.check.jsonpath.JsonPathCheckType,com.fasterxml.jackson.databind.JsonNode,String]
required: ru.tinkoff.gatling.amqp.AmqpCheck
(which expands to) io.gatling.core.check.Check[ru.tinkoff.gatling.amqp.request.AmqpProtocolMessage]
bodyString.exists,jsonPath("$.id").exists)
I am fairly new to scala and gatling, so i am not exactly sure of what is causing the issue( seems the plugin is expecting some other type expression: check(bodyString.exists,jsonPath("$.id").exists)).
class RequestReply extends Simulation{
val amqpConf: AmqpProtocolBuilder = amqp
.connectionFactory(
rabbitmq
.host("localhost")
.port(9081)
.username("usr")
.password("pwd")
.vhost("/vhost")
)
.replyTimeout(60000)
.consumerThreadsCount(8)
.matchByMessageId
.usePersistentDeliveryMode
val scn: ScenarioBuilder = scenario("AMQP")
.feed(idFeeder) /
.exec(
amqp("Consume Publish Test").requestReply
.directExchange("direct.exchange", "direcs.rk")
.replyExchange("rep-queue-mq") // here i given the queue name where the message is published by the application after processing (this queue is another exchange)
.textMessage("{"id":"${id}","message":"testmessage"}")
.messageId("${id}")
.priority(0)
.property("content_type", "application/json")
.check(
bodyString.exists)
Note : I tried to publish and consume from the same queue ..its working there.( tried to print the response in this case and found the below output as expected.
Response body:
{"id":"10020","msg":"test"}
Response body:
{"id":"10021","msg":"test"}
Response body:
{"id":"10022","msg":"test"}
.check(
bodyString.exists,bodyString.saveAs("BODY"))
).exec({session =>
val response = session("BODY").as[String]
println(s"Response body: \n$response")
session
})
Hey Guys,
I'm relatively new to scala/gatling and I'm working on a test where I want to match messages on different queues using a custom headers . From what I've gathered I would need to use the mapByMessage but unfortunately have been unable to find an example on how to do this. Does anyone have an example?
Hi,
I am using your plugin to publish amqp messages to an existing queue. But the test fails to publish with the error
Wrapped by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'x-expi
res' for queue 'xxxxx-xxxxx-xxxxxx' in vhost '/': received none but current is the value '600000' of
type 'long', class-id=50, method-id=10)
I assume that this if failing because i am unable to set the queue properties
Below is my test
class PublishExample extends Simulation {
val source: BufferedSource = Source.fromFile("./sport/icehockey.json")
val payload: String = try source.mkString finally source.close()
val amqpConf: AmqpProtocolBuilder = amqp
.connectionFactory(
rabbitmq
.host("xxx-xxx")
.port(5672)
.vhost("/")
.username("guest")
.password("guest")
).replyTimeout(600000)
.usePersistentDeliveryMode
val cfProps: java.util.Map[String,AnyRef] = new java.util.HashMap[String,AnyRef]
cfProps.put("'x-expires","600000")
amqpConf.connectionFactory.setClientProperties(cfProps)
val props: scala.collection.immutable.Map[String,String] =
Map("content-type" -> "application/json",
"contentEncoding" -> "utf-8",
"[SerializerType]" -> "Newtonsoft.Json.JsonConverter"
val scn: ScenarioBuilder = scenario("AMQP test")
.feed(idFeeder)
.exec(
amqp("publish to exchange").publish
.queueExchange("xxxx-xxxx-xxxx-xxxx") .bytesMessage(payload.getBytes("UTF-8"))
.property("x-expires",600000)
.headers(props)
)
setUp(
scn.inject(rampUsers(10) during (10 seconds))
).protocols(amqpConf)
.maxDuration(10 minutes)
}
Could you please help ?
Can u pls add details to run these files? I am new to gatling. trying to run PublishExample.scala
Gatling 3.5.0 has been (https://gatling.io/2020/12/18/gatling-3-5-0-and-gatling-frontline-1-13-0-are-out/) released. Itnow runs wih scala 2.13. Are there plans when to support this version of gatling?
If I see the following before the tests finishes
waiting: 0 / active: 10 / done: 230
Than the test result looks like
---- Response Time Distribution ------------------------------------------------
> t < 800 ms 230 (100%)
> 800 ms < t < 1200 ms 0 ( 0%)
> t > 1200 ms 0 ( 0%)
> failed 0 ( 0%)
But it should look like (and reflect that some messages have not been processed)
---- Response Time Distribution ------------------------------------------------
> t < 800 ms 230 (96%)
> 800 ms < t < 1200 ms 0 ( 0%)
> t > 1200 ms 0 ( 0%)
> failed 10 ( 4%)
My supercool system reads from MessageBrokerA and writes to MessageBrokerB. How is it possible to use the plugin in a way that it uses MessageBrokerA for sending and MessageBroker B for receiving?
If I understand the provided example correct than its implicitly assumed that all queues and exchanges are hostet at the same MessageBroker.
Hi,
I would like to publish/consume messages from multiple hosts. is that already supported ?
One more thing can you please provide an example of reading messages from a existing queue and validate the message body in a gatling session please ?
I am able to use request reply with amqp but my reply queue has more than one response messages. I want to keep checking all responses till I get final response with status as complete. Please refer this question
It is common that the connection is secured.
I do not see an option to establish secured connection.
In other libraries it is dane by just setting an extra flag (of course Rabbit use other port for secured connection and ip address should be raplaced by domain address).
Hello,
I hope you can assist. I tried to use your plugin. But I always see the error:
11:27:15.464 [ERROR] i.g.a.Gatling$ - Run crashed
java.lang.IncompatibleClassChangeError: Implementing class
can you assist?
I will add my pom and my simulation file and complete maven output.
thanks in advance
Hellou,
Im new in Gatling and Scala at all. Can you please show me how to create connectionFactory to AMQPS?
Now I got error Connection reset
Many thanks
my code:
val amqpConf: AmqpProtocolBuilder = amqp .connectionFactory( rabbitmq .host("mq.xxx.xxx.com") .port(5671) .vhost("/") .username("someUsername") .password("somePassword") ) .usePersistentDeliveryMode
Hi @red-bashmak.. thank you for the plugin.
i have created a simple scala project using Maven and added dependency for the plugin as per the link below,
https://search.maven.org/artifact/ru.tinkoff/gatling-amqp-plugin_2.13
below is my code snippet for publishing the message into our queue,
package simulations
import io.gatling.core.Predef._
import io.gatling.core.structure.ScenarioBuilder
import ru.tinkoff.gatling.amqp.Predef._
import ru.tinkoff.gatling.amqp.protocol.AmqpProtocolBuilder
class HinoRabbitMQPublish extends Simulation{
val amqpConf: AmqpProtocolBuilder = amqp
.connectionFactory(
rabbitmq
.host("hasty-whale.rmq.cloudamqp.com")
.port(5672)
.username("******")
.password("")
.vhost("********************")
)
.usePersistentDeliveryMode
.declare(queue("measurement_data_hino_us_pilot_uat"))
val scn: ScenarioBuilder = scenario("AMQP test")
.exec(
amqp("publish to us_pilot_uat")
.publish
.queueExchange("measurement_data_hino_us_pilot_uat")
.textMessage("Hello message - ${id}")
.messageId("${id}")
.priority(0)
)
setUp(
scn.inject(atOnceUsers(1))).protocols(amqpConf)
}
i am receiving below error, while running the script,
"C:\Users\Naveen Kumar.jdks\openjdk-15.0.2\bin\java.exe" -javaagent:F:\Incture\Performance\Software\IDE\ideaIC-2020.3.3.win\lib\idea_rt.jar=60454:F:\Incture\Performance\Software\IDE\ideaIC-2020.3.3.win\bin -Dfile.encoding=UTF-8 -classpath "C:\Users\Naveen Kumar\IdeaProjects\hino_performance\target\test-classes;C:\Users\Naveen Kumar.ivy2\cache\org.scala-lang\scala-library\jars\scala-library-2.13.5.jar;C:\Users\Naveen Kumar.ivy2\cache\org.scala-lang\scala-reflect\jars\scala-reflect-2.13.5.jar;C:\Users\Naveen Kumar.ivy2\cache\org.scala-lang\scala-library\srcs\scala-library-2.13.5-sources.jar;C:\Users\Naveen Kumar.m2\repository\io\gatling\highcharts\gatling-charts-highcharts\3.5.1\gatling-charts-highcharts-3.5.1.jar;C:\Users\Naveen Kumar.m2\repository\org\scala-lang\scala-library\2.13.3\scala-library-2.13.3.jar;C:\Users\Naveen Kumar.m2\repository\io\gatling\gatling-app\3.5.1\gatling-app-3.5.1.jar;C:\Users\Naveen Kumar.m2\repository\io\gatling\gatling-core\3.5.1\gatling-core-3.5.1.jar;C:\Users\Naveen Kumar.m2\repository\io\gatling\gatling-commons\3.5.1\gatling-commons-3.5.1.jar;C:\Users\Naveen Kumar.m2\repository\io\gatling\gatling-commons-shared\3.5.1\gatling-commons-shared-3.5.1.jar;C:\Users\Naveen Kumar.m2\repository\org\scala-lang\scala-reflect\2.13.3\scala-reflect-2.13.3.jar;C:\Users\Naveen Kumar.m2\repository\io\suzaku\boopickle_2.13\1.3.3\boopickle_2.13-1.3.3.jar;C:\Users\Naveen Kumar.m2\repository\io\gatling\gatling-commons-shared-unstable\3.5.1\gatling-commons-shared-unstable-3.5.1.jar;C:\Users\Naveen Kumar.m2\repository\org\typelevel\spire-macros_2.13\0.17.0\spire-macros_2.13-0.17.0.jar;C:\Users\Naveen Kumar.m2\repository\com\typesafe\scala-logging\scala-logging_2.13\3.9.2\scala-logging_2.13-3.9.2.jar;C:\Users\Naveen Kumar.m2\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;C:\Users\Naveen Kumar.m2\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;C:\Users\Naveen Kumar.m2\repository\io\gatling\gatling-jsonpath\3.5.1\gatling-jsonpath-3.5.1.jar;C:\Users\Naveen Kumar.m2\repository\com\typesafe\akka\akka-slf4j_2.13\2.6.11\akka-slf4j_2.13-2.6.11.jar;C:\Users\Naveen Kumar.m2\repository\org\simpleflatmapper\lightning-csv\8.2.3\lightning-csv-8.2.3.jar;C:\Users\Naveen Kumar.m2\repository\org\simpleflatmapper\sfm-util\8.2.3\sfm-util-8.2.3.jar;C:\Users\Naveen Kumar.m2\repository\com\github\ben-manes\caffeine\caffeine\2.8.8\caffeine-2.8.8.jar;C:\Users\Naveen Kumar.m2\repository\org\checkerframework\checker-qual\3.8.0\checker-qual-3.8.0.jar;C:\Users\Naveen Kumar.m2\repository\com\google\errorprone\error_prone_annotations\2.4.0\error_prone_annotations-2.4.0.jar;C:\Users\Naveen Kumar.m2\repository\io\pebbletemplates\pebble\3.1.4\pebble-3.1.4.jar;C:\Users\Naveen Kumar.m2\repository\org\unbescape\unbescape\1.1.6.RELEASE\unbescape-1.1.6.RELEASE.jar;C:\Users\Naveen Kumar.m2\repository\org\scala-lang\modules\scala-parser-combinators_2.13\1.1.2\scala-parser-combinators_2.13-1.1.2.jar;C:\Users\Naveen Kumar.m2\repository\com\github\scopt\scopt_2.13\3.7.1\scopt_2.13-3.7.1.jar;C:\Users\Naveen Kumar.m2\repository\io\netty\netty-handler\4.1.58.Final\netty-handler-4.1.58.Final.jar;C:\Users\Naveen Kumar.m2\repository\io\netty\netty-resolver\4.1.58.Final\netty-resolver-4.1.58.Final.jar;C:\Users\Naveen Kumar.m2\repository\com\softwaremill\quicklens\quicklens_2.13\1.6.1\quicklens_2.13-1.6.1.jar;C:\Users\Naveen Kumar.m2\repository\net\sf\saxon\Saxon-HE\10.3\Saxon-HE-10.3.jar;C:\Users\Naveen Kumar.m2\repository\org\jodd\jodd-lagarto\6.0.3\jodd-lagarto-6.0.3.jar;C:\Users\Naveen Kumar.m2\repository\org\jodd\jodd-util\6.0.0\jodd-util-6.0.0.jar;C:\Users\Naveen Kumar.m2\repository\io\burt\jmespath-jackson\0.5.0\jmespath-jackson-0.5.0.jar;C:\Users\Naveen Kumar.m2\repository\io\burt\jmespath-core\0.5.0\jmespath-core-0.5.0.jar;C:\Users\Naveen Kumar.m2\repository\io\gatling\gatling-http\3.5.1\gatling-http-3.5.1.jar;C:\Users\Naveen Kumar.m2\repository\io\gatling\gatling-http-client\3.5.1\gatling-http-client-3.5.1.jar;C:\Users\Naveen Kumar.m2\repository\io\gatling\gatling-netty-util\3.5.1\gatling-netty-util-3.5.1.jar;C:\Users\Naveen Kumar.m2\repository\io\netty\netty-handler-proxy\4.1.58.Final\netty-handler-proxy-4.1.58.Final.jar;C:\Users\Naveen Kumar.m2\repository\io\netty\netty-codec-socks\4.1.58.Final\netty-codec-socks-4.1.58.Final.jar;C:\Users\Naveen Kumar.m2\repository\io\netty\netty-resolver-dns\4.1.58.Final\netty-resolver-dns-4.1.58.Final.jar;C:\Users\Naveen Kumar.m2\repository\io\netty\netty-codec-dns\4.1.58.Final\netty-codec-dns-4.1.58.Final.jar;C:\Users\Naveen Kumar.m2\repository\io\netty\netty-transport-native-epoll\4.1.58.Final\netty-transport-native-epoll-4.1.58.Final-linux-x86_64.jar;C:\Users\Naveen Kumar.m2\repository\io\netty\netty-transport-native-unix-common\4.1.58.Final\netty-transport-native-unix-common-4.1.58.Final.jar;C:\Users\Naveen Kumar.m2\repository\io\netty\netty-codec-http2\4.1.58.Final\netty-codec-http2-4.1.58.Final.jar;C:\Users\Naveen Kumar.m2\repository\io\netty\netty-tcnative-boringssl-static\2.0.36.Final\netty-tcnative-boringssl-static-2.0.36.Final.jar;C:\Users\Naveen Kumar.m2\repository\io\gatling\gatling-jms\3.5.1\gatling-jms-3.5.1.jar;C:\Users\Naveen Kumar.m2\repository\javax\jms\javax.jms-api\2.0.1\javax.jms-api-2.0.1.jar;C:\Users\Naveen Kumar.m2\repository\io\gatling\gatling-jdbc\3.5.1\gatling-jdbc-3.5.1.jar;C:\Users\Naveen Kumar.m2\repository\io\gatling\gatling-redis\3.5.1\gatling-redis-3.5.1.jar;C:\Users\Naveen Kumar.m2\repository\net\debasishg\redisclient_2.13\3.30\redisclient_2.13-3.30.jar;C:\Users\Naveen Kumar.m2\repository\io\gatling\gatling-graphite\3.5.1\gatling-graphite-3.5.1.jar;C:\Users\Naveen Kumar.m2\repository\org\hdrhistogram\HdrHistogram\2.1.12\HdrHistogram-2.1.12.jar;C:\Users\Naveen Kumar.m2\repository\io\gatling\gatling-charts\3.5.1\gatling-charts-3.5.1.jar;C:\Users\Naveen Kumar.m2\repository\com\tdunning\t-digest\3.1\t-digest-3.1.jar;C:\Users\Naveen Kumar.m2\repository\io\gatling\gatling-recorder\3.5.1\gatling-recorder-3.5.1.jar;C:\Users\Naveen Kumar.m2\repository\org\scala-lang\modules\scala-swing_2.13\3.0.0\scala-swing_2.13-3.0.0.jar;C:\Users\Naveen Kumar.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.12.1\jackson-databind-2.12.1.jar;C:\Users\Naveen Kumar.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.12.1\jackson-annotations-2.12.1.jar;C:\Users\Naveen Kumar.m2\repository\com\fasterxml\jackson\core\jackson-core\2.12.1\jackson-core-2.12.1.jar;C:\Users\Naveen Kumar.m2\repository\org\bouncycastle\bcpkix-jdk15on\1.68\bcpkix-jdk15on-1.68.jar;C:\Users\Naveen Kumar.m2\repository\org\bouncycastle\bcprov-jdk15on\1.68\bcprov-jdk15on-1.68.jar;C:\Users\Naveen Kumar.m2\repository\io\netty\netty-codec-http\4.1.58.Final\netty-codec-http-4.1.58.Final.jar;C:\Users\Naveen Kumar.m2\repository\io\netty\netty-common\4.1.58.Final\netty-common-4.1.58.Final.jar;C:\Users\Naveen Kumar.m2\repository\io\netty\netty-buffer\4.1.58.Final\netty-buffer-4.1.58.Final.jar;C:\Users\Naveen Kumar.m2\repository\io\netty\netty-transport\4.1.58.Final\netty-transport-4.1.58.Final.jar;C:\Users\Naveen Kumar.m2\repository\io\netty\netty-codec\4.1.58.Final\netty-codec-4.1.58.Final.jar;C:\Users\Naveen Kumar.m2\repository\com\typesafe\akka\akka-actor_2.13\2.6.11\akka-actor_2.13-2.6.11.jar;C:\Users\Naveen Kumar.m2\repository\com\typesafe\config\1.4.0\config-1.4.0.jar;C:\Users\Naveen Kumar.m2\repository\org\scala-lang\modules\scala-java8-compat_2.13\0.9.0\scala-java8-compat_2.13-0.9.0.jar;C:\Users\Naveen Kumar.m2\repository\ru\tinkoff\gatling-amqp-plugin_2.13\0.5.0\gatling-amqp-plugin_2.13-0.5.0.jar;C:\Users\Naveen Kumar.m2\repository\com\rabbitmq\amqp-client\5.11.0\amqp-client-5.11.0.jar;C:\Users\Naveen Kumar.m2\repository\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;C:\Users\Naveen Kumar.m2\repository\org\apache\commons\commons-pool2\2.9.0\commons-pool2-2.9.0.jar;C:\Users\Naveen Kumar.m2\repository\com\eatthepath\fast-uuid\0.1\fast-uuid-0.1.jar" Engine
14:10:40.900 [main] INFO io.gatling.core.config.GatlingConfiguration$ - Gatling will try to use 'gatling.conf' as custom config file.
14:10:41.693 [GatlingSystem-akka.actor.default-dispatcher-4] INFO akka.event.slf4j.Slf4jLogger - Slf4jLogger started
14:10:42.185 [main] DEBUG io.netty.util.internal.logging.InternalLoggerFactory - Using SLF4J as the default logging framework
14:10:42.323 [main] DEBUG io.netty.channel.MultithreadEventLoopGroup - -Dio.netty.eventLoopThreads: 16
14:10:42.340 [main] DEBUG io.netty.util.internal.InternalThreadLocalMap - -Dio.netty.threadLocalMap.stringBuilder.initialSize: 1024
14:10:42.340 [main] DEBUG io.netty.util.internal.InternalThreadLocalMap - -Dio.netty.threadLocalMap.stringBuilder.maxSize: 4096
14:10:42.349 [main] DEBUG io.netty.channel.nio.NioEventLoop - -Dio.netty.noKeySetOptimization: false
14:10:42.349 [main] DEBUG io.netty.channel.nio.NioEventLoop - -Dio.netty.selectorAutoRebuildThreshold: 512
14:10:42.367 [main] DEBUG io.netty.util.internal.PlatformDependent - Platform: Windows
14:10:42.369 [main] DEBUG io.netty.util.internal.PlatformDependent0 - -Dio.netty.noUnsafe: false
14:10:42.369 [main] DEBUG io.netty.util.internal.PlatformDependent0 - Java version: 15
14:10:42.370 [main] DEBUG io.netty.util.internal.PlatformDependent0 - sun.misc.Unsafe.theUnsafe: available
14:10:42.371 [main] DEBUG io.netty.util.internal.PlatformDependent0 - sun.misc.Unsafe.copyMemory: available
14:10:42.371 [main] DEBUG io.netty.util.internal.PlatformDependent0 - java.nio.Buffer.address: available
14:10:42.374 [main] DEBUG io.netty.util.internal.PlatformDependent0 - direct buffer constructor: unavailable
java.lang.UnsupportedOperationException: Reflective setAccessible(true) disabled
at io.netty.util.internal.ReflectionUtil.trySetAccessible(ReflectionUtil.java:31)
at io.netty.util.internal.PlatformDependent0$4.run(PlatformDependent0.java:238)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:312)
at io.netty.util.internal.PlatformDependent0.(PlatformDependent0.java:232)
at io.netty.util.internal.PlatformDependent.isAndroid(PlatformDependent.java:293)
at io.netty.util.internal.PlatformDependent.(PlatformDependent.java:92)
at io.netty.channel.nio.NioEventLoop.newTaskQueue0(NioEventLoop.java:279)
at io.netty.channel.nio.NioEventLoop.newTaskQueue(NioEventLoop.java:150)
at io.netty.channel.nio.NioEventLoop.(NioEventLoop.java:138)
at io.netty.channel.nio.NioEventLoopGroup.newChild(NioEventLoopGroup.java:146)
at io.netty.channel.nio.NioEventLoopGroup.newChild(NioEventLoopGroup.java:37)
at io.netty.util.concurrent.MultithreadEventExecutorGroup.(MultithreadEventExecutorGroup.java:84)
at io.netty.util.concurrent.MultithreadEventExecutorGroup.(MultithreadEventExecutorGroup.java:58)
at io.netty.util.concurrent.MultithreadEventExecutorGroup.(MultithreadEventExecutorGroup.java:47)
at io.netty.channel.MultithreadEventLoopGroup.(MultithreadEventLoopGroup.java:59)
at io.netty.channel.nio.NioEventLoopGroup.(NioEventLoopGroup.java:86)
at io.netty.channel.nio.NioEventLoopGroup.(NioEventLoopGroup.java:81)
at io.netty.channel.nio.NioEventLoopGroup.(NioEventLoopGroup.java:68)
at io.gatling.netty.util.Transports.newEventLoopGroup(Transports.java:41)
at io.gatling.app.Gatling$.start(Gatling.scala:74)
at io.gatling.app.Gatling$.fromMap(Gatling.scala:40)
at Engine$.delayedEndpoint$Engine$1(Engine.scala:11)
at Engine$delayedInit$body.apply(Engine.scala:4)
at scala.Function0.apply$mcV$sp(Function0.scala:39)
at scala.Function0.apply$mcV$sp$(Function0.scala:39)
at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:17)
at scala.App.$anonfun$main$1(App.scala:76)
at scala.App.$anonfun$main$1$adapted(App.scala:76)
at scala.collection.IterableOnceOps.foreach(IterableOnce.scala:563)
at scala.collection.IterableOnceOps.foreach$(IterableOnce.scala:561)
at scala.collection.AbstractIterable.foreach(Iterable.scala:919)
at scala.App.main(App.scala:76)
at scala.App.main$(App.scala:74)
at Engine$.main(Engine.scala:4)
at Engine.main(Engine.scala)
14:10:42.376 [main] DEBUG io.netty.util.internal.PlatformDependent0 - java.nio.Bits.unaligned: available, true
14:10:42.377 [main] DEBUG io.netty.util.internal.PlatformDependent0 - jdk.internal.misc.Unsafe.allocateUninitializedArray(int): unavailable
java.lang.IllegalAccessException: class io.netty.util.internal.PlatformDependent0$6 cannot access class jdk.internal.misc.Unsafe (in module java.base) because module java.base does not export jdk.internal.misc to unnamed module @5a955565
at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:385)
at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:693)
at java.base/java.lang.reflect.Method.invoke(Method.java:556)
at io.netty.util.internal.PlatformDependent0$6.run(PlatformDependent0.java:352)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:312)
at io.netty.util.internal.PlatformDependent0.(PlatformDependent0.java:343)
at io.netty.util.internal.PlatformDependent.isAndroid(PlatformDependent.java:293)
at io.netty.util.internal.PlatformDependent.(PlatformDependent.java:92)
at io.netty.channel.nio.NioEventLoop.newTaskQueue0(NioEventLoop.java:279)
at io.netty.channel.nio.NioEventLoop.newTaskQueue(NioEventLoop.java:150)
at io.netty.channel.nio.NioEventLoop.(NioEventLoop.java:138)
at io.netty.channel.nio.NioEventLoopGroup.newChild(NioEventLoopGroup.java:146)
at io.netty.channel.nio.NioEventLoopGroup.newChild(NioEventLoopGroup.java:37)
at io.netty.util.concurrent.MultithreadEventExecutorGroup.(MultithreadEventExecutorGroup.java:84)
at io.netty.util.concurrent.MultithreadEventExecutorGroup.(MultithreadEventExecutorGroup.java:58)
at io.netty.util.concurrent.MultithreadEventExecutorGroup.(MultithreadEventExecutorGroup.java:47)
at io.netty.channel.MultithreadEventLoopGroup.(MultithreadEventLoopGroup.java:59)
at io.netty.channel.nio.NioEventLoopGroup.(NioEventLoopGroup.java:86)
at io.netty.channel.nio.NioEventLoopGroup.(NioEventLoopGroup.java:81)
at io.netty.channel.nio.NioEventLoopGroup.(NioEventLoopGroup.java:68)
at io.gatling.netty.util.Transports.newEventLoopGroup(Transports.java:41)
at io.gatling.app.Gatling$.start(Gatling.scala:74)
at io.gatling.app.Gatling$.fromMap(Gatling.scala:40)
at Engine$.delayedEndpoint$Engine$1(Engine.scala:11)
at Engine$delayedInit$body.apply(Engine.scala:4)
at scala.Function0.apply$mcV$sp(Function0.scala:39)
at scala.Function0.apply$mcV$sp$(Function0.scala:39)
at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:17)
at scala.App.$anonfun$main$1(App.scala:76)
at scala.App.$anonfun$main$1$adapted(App.scala:76)
at scala.collection.IterableOnceOps.foreach(IterableOnce.scala:563)
at scala.collection.IterableOnceOps.foreach$(IterableOnce.scala:561)
at scala.collection.AbstractIterable.foreach(Iterable.scala:919)
at scala.App.main(App.scala:76)
at scala.App.main$(App.scala:74)
at Engine$.main(Engine.scala:4)
at Engine.main(Engine.scala)
14:10:42.377 [main] DEBUG io.netty.util.internal.PlatformDependent0 - java.nio.DirectByteBuffer.(long, int): unavailable
14:10:42.377 [main] DEBUG io.netty.util.internal.PlatformDependent - sun.misc.Unsafe: available
14:10:42.393 [main] DEBUG io.netty.util.internal.PlatformDependent - maxDirectMemory: 2120220672 bytes (maybe)
14:10:42.394 [main] DEBUG io.netty.util.internal.PlatformDependent - -Dio.netty.tmpdir: C:\Users\NAVEEN~1\AppData\Local\Temp (java.io.tmpdir)
14:10:42.394 [main] DEBUG io.netty.util.internal.PlatformDependent - -Dio.netty.bitMode: 64 (sun.arch.data.model)
14:10:42.395 [main] DEBUG io.netty.util.internal.PlatformDependent - -Dio.netty.maxDirectMemory: -1 bytes
14:10:42.396 [main] DEBUG io.netty.util.internal.PlatformDependent - -Dio.netty.uninitializedArrayAllocationThreshold: -1
14:10:42.397 [main] DEBUG io.netty.util.internal.CleanerJava9 - java.nio.ByteBuffer.cleaner(): available
14:10:42.397 [main] DEBUG io.netty.util.internal.PlatformDependent - -Dio.netty.noPreferDirect: false
14:10:42.406 [main] DEBUG io.netty.util.internal.PlatformDependent - org.jctools-core.MpscChunkedArrayQueue: available
Choose a simulation number:
[0] simulations.HinoRabbitMQPublish
[1] simulations.TestAPI
0
Select run description (optional)
14:10:51.991 [main] ERROR io.gatling.app.Gatling$ - Run crashed
java.io.IOException: null
at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:129)
at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:125)
at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:147)
at com.rabbitmq.client.impl.ChannelN.queueDeclare(ChannelN.java:968)
at com.rabbitmq.client.impl.recovery.AutorecoveringChannel.queueDeclare(AutorecoveringChannel.java:343)
at ru.tinkoff.gatling.amqp.protocol.AmqpProtocol$$anon$1$$anonfun$runInitAction$1.applyOrElse(AmqpProtocol.scala:64)
at ru.tinkoff.gatling.amqp.protocol.AmqpProtocol$$anon$1$$anonfun$runInitAction$1.applyOrElse(AmqpProtocol.scala:60)
at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:35)
at scala.collection.immutable.List.foreach(List.scala:333)
at ru.tinkoff.gatling.amqp.protocol.AmqpProtocol$$anon$1.$anonfun$newComponents$1(AmqpProtocol.scala:77)
at io.gatling.core.protocol.ProtocolComponentsRegistry.comps$1(Protocol.scala:71)
at io.gatling.core.protocol.ProtocolComponentsRegistry.$anonfun$components$4(Protocol.scala:73)
at scala.collection.mutable.HashMap.getOrElseUpdate(HashMap.scala:454)
at io.gatling.core.protocol.ProtocolComponentsRegistry.components(Protocol.scala:73)
at ru.tinkoff.gatling.amqp.action.PublishBuilder.components(PublishBuilder.scala:14)
at ru.tinkoff.gatling.amqp.action.PublishBuilder.build(PublishBuilder.scala:18)
at io.gatling.core.structure.BuildAction.$anonfun$build$1(BuildAction.scala:28)
at scala.collection.LinearSeqOps.foldLeft(LinearSeq.scala:169)
at scala.collection.LinearSeqOps.foldLeft$(LinearSeq.scala:165)
at scala.collection.immutable.List.foldLeft(List.scala:79)
at io.gatling.core.structure.BuildAction.build(BuildAction.scala:27)
at io.gatling.core.structure.BuildAction.build$(BuildAction.scala:26)
at io.gatling.core.structure.ScenarioBuilder.build(StructureBuilder.scala:51)
at io.gatling.core.structure.PopulationBuilder.build(PopulationBuilder.scala:100)
at io.gatling.core.scenario.SimulationParams.buildScenario(Simulation.scala:170)
at io.gatling.core.scenario.SimulationParams.$anonfun$scenarios$1(Simulation.scala:174)
at scala.collection.immutable.List.map(List.scala:246)
at io.gatling.core.scenario.SimulationParams.scenarios(Simulation.scala:174)
at io.gatling.app.Runner.run0(Runner.scala:82)
at io.gatling.app.Runner.run(Runner.scala:52)
at io.gatling.app.Gatling$.start(Gatling.scala:80)
at io.gatling.app.Gatling$.fromMap(Gatling.scala:40)
at Engine$.delayedEndpoint$Engine$1(Engine.scala:11)
at Engine$delayedInit$body.apply(Engine.scala:4)
at scala.Function0.apply$mcV$sp(Function0.scala:39)
at scala.Function0.apply$mcV$sp$(Function0.scala:39)
at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:17)
at scala.App.$anonfun$main$1(App.scala:76)
at scala.App.$anonfun$main$1$adapted(App.scala:76)
at scala.collection.IterableOnceOps.foreach(IterableOnce.scala:563)
at scala.collection.IterableOnceOps.foreach$(IterableOnce.scala:561)
at scala.collection.AbstractIterable.foreach(Iterable.scala:919)
at scala.App.main(App.scala:76)
at scala.App.main$(App.scala:74)
at Engine$.main(Engine.scala:4)
at Engine.main(Engine.scala)
Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'auto_delete' for queue 'measurement_data_hino_us_pilot_uat' in vhost 'fdc97e13-563c-41b1-843b-1ecf7dbc62d3': received 'true' but current is 'false', class-id=50, method-id=10)
at com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:66)
at com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValue(BlockingValueOrException.java:36)
at com.rabbitmq.client.impl.AMQChannel$BlockingRpcContinuation.getReply(AMQChannel.java:502)
at com.rabbitmq.client.impl.AMQChannel.privateRpc(AMQChannel.java:293)
at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:141)
... 43 common frames omitted
Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'auto_delete' for queue 'measurement_data_hino_us_pilot_uat' in vhost 'fdc97e13-563c-41b1-843b-1ecf7dbc62d3': received 'true' but current is 'false', class-id=50, method-id=10)
at com.rabbitmq.client.impl.ChannelN.asyncShutdown(ChannelN.java:517)
at com.rabbitmq.client.impl.ChannelN.processAsync(ChannelN.java:341)
at com.rabbitmq.client.impl.AMQChannel.handleCompleteInboundCommand(AMQChannel.java:182)
at com.rabbitmq.client.impl.AMQChannel.handleFrame(AMQChannel.java:114)
at com.rabbitmq.client.impl.AMQConnection.readFrame(AMQConnection.java:739)
at com.rabbitmq.client.impl.AMQConnection.access$300(AMQConnection.java:47)
at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:666)
at java.base/java.lang.Thread.run(Thread.java:832)
Exception in thread "main" java.io.IOException
at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:129)
at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:125)
at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:147)
at com.rabbitmq.client.impl.ChannelN.queueDeclare(ChannelN.java:968)
at com.rabbitmq.client.impl.recovery.AutorecoveringChannel.queueDeclare(AutorecoveringChannel.java:343)
at ru.tinkoff.gatling.amqp.protocol.AmqpProtocol$$anon$1$$anonfun$runInitAction$1.applyOrElse(AmqpProtocol.scala:64)
at ru.tinkoff.gatling.amqp.protocol.AmqpProtocol$$anon$1$$anonfun$runInitAction$1.applyOrElse(AmqpProtocol.scala:60)
at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:35)
at scala.collection.immutable.List.foreach(List.scala:333)
at ru.tinkoff.gatling.amqp.protocol.AmqpProtocol$$anon$1.$anonfun$newComponents$1(AmqpProtocol.scala:77)
at io.gatling.core.protocol.ProtocolComponentsRegistry.comps$1(Protocol.scala:71)
at io.gatling.core.protocol.ProtocolComponentsRegistry.$anonfun$components$4(Protocol.scala:73)
at scala.collection.mutable.HashMap.getOrElseUpdate(HashMap.scala:454)
at io.gatling.core.protocol.ProtocolComponentsRegistry.components(Protocol.scala:73)
at ru.tinkoff.gatling.amqp.action.PublishBuilder.components(PublishBuilder.scala:14)
at ru.tinkoff.gatling.amqp.action.PublishBuilder.build(PublishBuilder.scala:18)
at io.gatling.core.structure.BuildAction.$anonfun$build$1(BuildAction.scala:28)
at scala.collection.LinearSeqOps.foldLeft(LinearSeq.scala:169)
at scala.collection.LinearSeqOps.foldLeft$(LinearSeq.scala:165)
at scala.collection.immutable.List.foldLeft(List.scala:79)
at io.gatling.core.structure.BuildAction.build(BuildAction.scala:27)
at io.gatling.core.structure.BuildAction.build$(BuildAction.scala:26)
at io.gatling.core.structure.ScenarioBuilder.build(StructureBuilder.scala:51)
at io.gatling.core.structure.PopulationBuilder.build(PopulationBuilder.scala:100)
at io.gatling.core.scenario.SimulationParams.buildScenario(Simulation.scala:170)
at io.gatling.core.scenario.SimulationParams.$anonfun$scenarios$1(Simulation.scala:174)
at scala.collection.immutable.List.map(List.scala:246)
at io.gatling.core.scenario.SimulationParams.scenarios(Simulation.scala:174)
at io.gatling.app.Runner.run0(Runner.scala:82)
at io.gatling.app.Runner.run(Runner.scala:52)
at io.gatling.app.Gatling$.start(Gatling.scala:80)
at io.gatling.app.Gatling$.fromMap(Gatling.scala:40)
at Engine$.delayedEndpoint$Engine$1(Engine.scala:11)
at Engine$delayedInit$body.apply(Engine.scala:4)
at scala.Function0.apply$mcV$sp(Function0.scala:39)
at scala.Function0.apply$mcV$sp$(Function0.scala:39)
at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:17)
at scala.App.$anonfun$main$1(App.scala:76)
at scala.App.$anonfun$main$1$adapted(App.scala:76)
at scala.collection.IterableOnceOps.foreach(IterableOnce.scala:563)
at scala.collection.IterableOnceOps.foreach$(IterableOnce.scala:561)
at scala.collection.AbstractIterable.foreach(Iterable.scala:919)
at scala.App.main(App.scala:76)
at scala.App.main$(App.scala:74)
at Engine$.main(Engine.scala:4)
at Engine.main(Engine.scala)
Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'auto_delete' for queue 'measurement_data_hino_us_pilot_uat' in vhost 'fdc97e13-563c-41b1-843b-1ecf7dbc62d3': received 'true' but current is 'false', class-id=50, method-id=10)
at com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:66)
at com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValue(BlockingValueOrException.java:36)
at com.rabbitmq.client.impl.AMQChannel$BlockingRpcContinuation.getReply(AMQChannel.java:502)
at com.rabbitmq.client.impl.AMQChannel.privateRpc(AMQChannel.java:293)
at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:141)
... 43 more
Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'auto_delete' for queue 'measurement_data_hino_us_pilot_uat' in vhost 'fdc97e13-563c-41b1-843b-1ecf7dbc62d3': received 'true' but current is 'false', class-id=50, method-id=10)
at com.rabbitmq.client.impl.ChannelN.asyncShutdown(ChannelN.java:517)
at com.rabbitmq.client.impl.ChannelN.processAsync(ChannelN.java:341)
at com.rabbitmq.client.impl.AMQChannel.handleCompleteInboundCommand(AMQChannel.java:182)
at com.rabbitmq.client.impl.AMQChannel.handleFrame(AMQChannel.java:114)
at com.rabbitmq.client.impl.AMQConnection.readFrame(AMQConnection.java:739)
at com.rabbitmq.client.impl.AMQConnection.access$300(AMQConnection.java:47)
at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:666)
at java.base/java.lang.Thread.run(Thread.java:832)
Process finished with exit code -1
Really appreciate, if you could help in resolving the issues. Thank you in advance :)
-Naveen.
In the RequestReplyExample the id
is injected in the message being sent.
But then the matching process starts and somehow the reply should contain the id
as well. Lets say that the reply has a different message format.
For example this is the message sent:
{
"x": 101
}
And this is the message received:
{
"y": 101
}
In the builder you provide I can set the id
for the message sent by using it inside the textMessage
.
amqp("name").requestReply
.topicExchange(name = "exchange-name, routingKey = "routing-key")
.replyExchange("queue-name")
.textMessage("{"x":#{id}}")
.messageId("#{id}")
The message being sent is correct and the reply message is also delivered. But this message has some random generated id:
r.t.g.a.a.RequestReply - Message sent user=1 AMQPMessageID=101
r.t.g.a.c.TrackerPool - Message received AmqpMessageID=0aee5b62-cba1-1858-abe5-386b1ba4b412 matchId=0aee5b62-cba1-1858-abe5-386b1ba4b412
How can we parse the value of y
in the reply message, in order to be used by the id matching algorithm?
I use this plugin for requestReply. Publishing for messages works but not all received messages are detected correctly.
I use the matchByMessage
and have an implementation which extracts the id of the sent and received message. I looks like that message is called with each message but at the end of the test there are always more or less active messages. Are there any known issues that messages are received to early before they are tracked as sent?
[####################################################################------] 93%
waiting: 0 / active: 7 / done: 93
================================================================================
please have a look at this branch:
https://github.com/TinkoffCreditSystems/gatling-amqp-plugin/compare/v0.0.4...n3wtron:feature/added-fanout?expand=1
Can you please create a branch for the previous Gatling version?
Hey Guys,
I want to send one msg in exchange and I want to reply in multi queue
Any solution Please ?
Example :
val scn : ScenarioBuilder = scenario("scenario with multi reply")
.feed(correlationIds)
.exec(
amqp("test AMQ").requestReply
.directExchange("exchange1", "keyrouting1")
.replyExchange("queue 1")
.replyExchange("queue 2")
.bytesMessage(RawFileBody("file.json"))
.contentType("application/json")
.headers("action" -> "process", "correlationId" -> "${correlationId}")
.priority(0)
)
Thanks :)
Due this bug it's not possible to match response with request when using correlationId for matching.
In logs there were a lot of messages about matchId is null. Is causes to show random results during simulation run because of matchId always null.
Sending byte messages to Rabbitmq/amqp is possible in scala, but missing from the java wrapper.
Please include bytesMessage
in PublishDslBuilderMessage.java
, wrapping ru.tinkoff.gatling.amqp.request.PublishDslBuilderMessage.bytesMessage
.
Is there any way to connect to an exist queue or exchange? I've noticed that the plugin tries to declare the exchange and if it is already created with additional params (such as dlq etc) it fails. I've noticed in the AmqpPublisher class we never pass the arguments to Rabbit.
Is there any way to bind multiple queues in AmqpProtocolBuilder?
Requirement is to bind multiple queues (Request & Response) instead of declaring it.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.