使用 Gatling 进行 Oracle AQ 负载测试

Oracle AQ load test with Gatling

我想设置一个 Gatling 测试用例以将消息放在 Oracle AQ 上。但我不知道如何设置以下内容:

val jmsConfig = jms
    .connectionFactoryName(???)
    .url("tcp://localhost:10002")
    .credentials("user", "secret")
    .contextFactory(???)
    .listenerCount(1)
    .usePersistentDeliveryMode

连接工厂名称是什么,上下文工厂是什么?

"contextFactory" 是您的 ContextFactory 的 class 名称。 Doc 似乎是 "oracle.jms.AQjmsFactory"。

"connectionFactoryName" 是用于 JNDI 查找的键。 Doc again 似乎是 "cn=OracleDBConnections"。

我设法使用 oracle.jms.AQjmsInitialContextFactory. 使它工作 上面提到的 oracle.jms.AQjmsFactory 不是InitialContextFactory 这样就不起作用了。

确保至少添加版本 11+ 的 Oracle AQ 依赖项才能找到 AQjmsInitialContextFactory。

您的数据库用户当然应该有正确的权限才能将消息插入队列 (table)。

Gatling 期望您具有请求-回复语义,因此它将等待收到回复。我实际上想在指定时间后中止等待回复,但我不知道该怎么做。所以如果有人知道如何.. 请告诉我:-)

MySimulation.scala

val jmsConfig = jms
    .connectionFactoryName("ConnectionFactory") // MUST!!!! be called ConnectionFactory, the AQjmsFactory expects this naming convention!
    .url("jdbc:oracle:thin:@host:1521:SID")
    .credentials("user", "password")
    .contextFactory("oracle.jms.AQjmsInitialContextFactory")
    .listenerCount(1)
    .usePersistentDeliveryMode

// TODO check how to set a timeout on the reply
val jmsScenario = scenario("JMS DSL test")
  .repeat(1) {
    exec(
      jms("req reply testing")
        .reqreply
        .queue("AQ_ADMIN.QUEUE_NAME")
        .textMessage("some message")
        .check(simpleCheck(checkBodyTextCorrect))
    )
}

def checkBodyTextCorrect(m: Message) = {
    // this assumes that the service just does an "uppercase" transform on the text
    m match {
        case tm: TextMessage => tm.getText == "text that should be in the reply message"
        case _ => false
    }
} 

setUp(jmsScenario.inject(atOnceUsers(1)).protocols(jmsConfig));

jndi.properties

我必须将 jndi.properties 添加到类路径中:

db_url=jdbc:oracle:thin:@host:1521:SID

pom.xml

依赖关系(maven):

<dependency>
    <groupId>oracle</groupId>
    <artifactId>aqapi</artifactId>
    <version>11.2.0.3</version>
</dependency>
<dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc6</artifactId>
    <version>11.2.0.2.0</version>
</dependency>
<dependency>
    <groupId>javax.transaction</groupId>
    <artifactId>jta</artifactId>
    <version>1.1</version>
</dependency>