Gatling无法使用SpringBoot 2.0.1.RELEASE

时间:2018-05-08 00:28:20

标签: spring spring-boot gradle gatling

我尝试使用 Spring Boot 2.0.1.RELEASE 设置 Gatling

我创建了这个api:

@RestController
@RequestMapping("/contact")
public class ContactController {

    @GetMapping
    public ResponseEntity get() {
        return ResponseEntity.ok("Contact retrieved successfully");
    }
}

这个基本模拟:

import io.gatling.core.Predef._
import io.gatling.http.Predef._

class ContactSimulation extends Simulation {

  val httpConf = http.baseURL("http://localhost:8080")

  val scn = scenario("GetContact")
    .exec(
      http("GetContact")
        .get("/contact")
        .check(status.is(200))
    )

  setUp(scn.inject(atOnceUsers(1))).protocols(httpConf)
}

build.gradle 以这种方式配置:

buildscript {
    ext {
        springBootVersion = '2.0.1.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'scala'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group = 'com.gatling.poc'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
}


dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    testCompile('org.springframework.boot:spring-boot-starter-test')
    testCompile('io.gatling.highcharts:gatling-charts-highcharts:2.3.0')
}

task loadTest(type: JavaExec) {
    dependsOn testClasses
    description = "Load Test With Gatling"
    group = "Load Test"
    classpath = sourceSets.test.runtimeClasspath
    jvmArgs = [
            "-Dgatling.core.directory.binaries=${sourceSets.test.output.classesDir.toString()}"
    ]
    main = "io.gatling.app.Gatling"
    args = [
            "--simulation", "com.gatling.poc.simulations.ContactSimulation",
            "--results-folder", "${buildDir}/gatling-results",
            "--binaries-folder", sourceSets.test.output.classesDir.toString(),
            "--bodies-folder", sourceSets.test.resources.srcDirs.toList().first().toString() + "/gatling/bodies",
    ]
}

执行测试时:

./gradlew loadTest

我得到以下的堆栈跟踪:

21:00:12.804 [main] WARN io.netty.util.concurrent.DefaultPromise - An exception was thrown by org.asynchttpclient.netty.request.NettyRequestSender$1.operationComplete()
java.lang.NoSuchMethodError: io.netty.channel.DefaultChannelId.newInstance()Lio/netty/channel/DefaultChannelId;
        at io.netty.channel.AbstractChannel.newId(AbstractChannel.java:111)
        at io.netty.channel.AbstractChannel.<init>(AbstractChannel.java:83)
        at io.netty.bootstrap.FailedChannel.<init>(FailedChannel.java:33)
        at io.netty.bootstrap.AbstractBootstrap.initAndRegister(AbstractBootstrap.java:330)
        at io.netty.bootstrap.Bootstrap.doResolveAndConnect(Bootstrap.java:163)
        at io.netty.bootstrap.Bootstrap.connect(Bootstrap.java:156)
        at org.asynchttpclient.netty.request.NettyChannelConnector.connect0(NettyChannelConnector.java:81)
        at org.asynchttpclient.netty.request.NettyChannelConnector.connect(NettyChannelConnector.java:69)
        at org.asynchttpclient.netty.request.NettyRequestSender$1.onSuccess(NettyRequestSender.java:292)
        at org.asynchttpclient.netty.request.NettyRequestSender$1.onSuccess(NettyRequestSender.java:285)
        at org.asynchttpclient.netty.SimpleFutureListener.operationComplete(SimpleFutureListener.java:24)
        at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:511)
        at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:485)
        at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:424)
        at io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:162)
        at io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:33)
        at org.asynchttpclient.netty.request.NettyRequestSender.sendRequestWithNewChannel(NettyRequestSender.java:285)
        at org.asynchttpclient.netty.request.NettyRequestSender.sendRequestWithCertainForceConnect(NettyRequestSender.java:136)
        at org.asynchttpclient.netty.request.NettyRequestSender.sendRequest(NettyRequestSender.java:107)
        at org.asynchttpclient.DefaultAsyncHttpClient.execute(DefaultAsyncHttpClient.java:216)
        at org.asynchttpclient.DefaultAsyncHttpClient.executeRequest(DefaultAsyncHttpClient.java:184)
        at org.asynchttpclient.DefaultAsyncHttpClient.executeRequest(DefaultAsyncHttpClient.java:206)
        at io.gatling.http.ahc.HttpEngine.warmpUp(HttpEngine.scala:96)
        at io.gatling.http.protocol.HttpProtocol$$anon$1.$anonfun$newComponents$1(HttpProtocol.scala:62)
        at io.gatling.core.protocol.ProtocolComponentsRegistry.comps$1(Protocol.scala:67)
        at io.gatling.core.protocol.ProtocolComponentsRegistry.$anonfun$components$4(Protocol.scala:69)
        at scala.collection.mutable.HashMap.getOrElseUpdate(HashMap.scala:82)
        at io.gatling.core.protocol.ProtocolComponentsRegistry.components(Protocol.scala:69)
        at io.gatling.http.action.HttpActionBuilder.lookUpHttpComponents(HttpActionBuilder.scala:25)
        at io.gatling.http.action.sync.HttpRequestActionBuilder.build(HttpRequestActionBuilder.scala:33)
        at io.gatling.core.structure.StructureBuilder.$anonfun$build$1(StructureBuilder.scala:34)
        at scala.collection.LinearSeqOptimized.foldLeft(LinearSeqOptimized.scala:122)
        at scala.collection.LinearSeqOptimized.foldLeft$(LinearSeqOptimized.scala:118)
        at scala.collection.immutable.List.foldLeft(List.scala:86)
        at io.gatling.core.structure.StructureBuilder.build(StructureBuilder.scala:33)
        at io.gatling.core.structure.StructureBuilder.build$(StructureBuilder.scala:32)
        at io.gatling.core.structure.ScenarioBuilder.build(ScenarioBuilder.scala:38)
        at io.gatling.core.structure.PopulationBuilder.build(ScenarioBuilder.scala:98)
        at io.gatling.core.scenario.SimulationParams.$anonfun$scenarios$1(Simulation.scala:188)
        at scala.collection.immutable.List.map(List.scala:283)
        at io.gatling.core.scenario.SimulationParams.scenarios(Simulation.scala:188)
        at io.gatling.app.Runner.run0(Runner.scala:95)
        at io.gatling.app.Runner.run(Runner.scala:64)
        at io.gatling.app.Gatling$.start(Gatling.scala:59)
        at io.gatling.app.Gatling$.fromArgs(Gatling.scala:43)
        at io.gatling.app.Gatling$.main(Gatling.scala:35)
        at io.gatling.app.Gatling.main(Gatling.scala)

如果我使用 SpringBoot 1.5.12.RELEASE 创建相同的项目,它可以很好地工作。我怀疑 spring-boot-gradle-plugin ,因为它根据SpringBoot版本而改变。

如果有必要,我可以在github中创建一个项目来演示问题。 =)

如果有人可以帮助我,我将不胜感激!

1 个答案:

答案 0 :(得分:0)

我解决了这个问题。

问题是 SpringBoot 2.0.1.RELEASE 使用的 io.netty 组的版本。它使用的版本 4.1.23.Final 由于某种原因(可能是scala中的一些更改)没有执行加特林测试。

我做了降级以使用与 SpringBoot 1.5.12.RELEASE 相同的版本,即 4.0.51.Final 。我必须将此配置添加到 build.gradle

{
// This build.gradle is the same that I posted above. For the sake of simplicity I just put the configuration that has been necessary to solve the problem.

// After dependencies{} section, I had to put this:

configurations.all {
    resolutionStrategy {
        eachDependency { DependencyResolveDetails details ->
            if (details.requested.group == 'io.netty') {
                details.useVersion "4.0.51.Final"
            }
        }
    }
}
}

我认为这不是最佳解决方案,因为我正在恢复io.netty版本以使用旧版本,这可能会产生一些副作用。在我的情况下,我没有选择降级SpringBoot版本。如果您可以选择恢复SpringBoot版本,我建议您这样做。