All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.jeanadrien.gatling.mqtt.actions.PublishAction.scala Maven / Gradle / Ivy

The newest version!
package com.github.jeanadrien.gatling.mqtt.actions

import akka.actor.ActorRef
import akka.pattern.ask
import akka.util.Timeout
import com.github.jeanadrien.gatling.mqtt.client.MqttCommands
import com.github.jeanadrien.gatling.mqtt.client.MqttQoS.MqttQoS
import com.github.jeanadrien.gatling.mqtt.protocol.MqttComponents
import io.gatling.commons.stats.{KO, OK}
import io.gatling.commons.util.ClockSingleton._
import io.gatling.core.CoreComponents
import io.gatling.core.action.Action
import io.gatling.core.session._

import scala.concurrent.duration._
import scala.util.{Failure, Success}

/**
  *
  */
class PublishAction(
    mqttComponents : MqttComponents,
    coreComponents : CoreComponents,
    topic          : Expression[String],
    payload        : Expression[Array[Byte]],
    qos            : MqttQoS,
    retain         : Boolean,
    val next       : Action
) extends MqttAction(mqttComponents, coreComponents) {

    import mqttComponents.system.dispatcher

    override val name = genName("mqttPublish")

    override def execute(session : Session) : Unit = recover(session)(for {
        connection <- session("engine").validate[ActorRef]
        connectionId <- session("connectionId").validate[String]
        resolvedTopic <- topic(session)
        resolvedPayload <- payload(session)
    } yield {
        implicit val timeout = Timeout(1 minute) // TODO check how to configure this

        val requestStartDate = nowMillis

        val requestName = "publish"

        logger.debug(s"${connectionId}: Execute ${requestName}:${resolvedTopic} Payload: ${resolvedPayload}")

        (connection ? MqttCommands.Publish(
            resolvedTopic, resolvedPayload, qos, retain
        )).mapTo[MqttCommands].onComplete {
            case Success(MqttCommands.PublishAck) =>
                val publishTimings = timings(requestStartDate)

                statsEngine.logResponse(
                    session,
                    requestName,
                    publishTimings,
                    OK,
                    None,
                    None
                )

                next ! session
            case Failure(th) =>
                val publishTimings = timings(requestStartDate)
                logger.warn(s"${connectionId}: Failed to publish on ${resolvedTopic}: ${th}")
                statsEngine.logResponse(
                    session,
                    requestName,
                    publishTimings,
                    KO,
                    None,
                    Some(th.getMessage)
                )

                next ! session
        }
    })
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy