首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gatling不使用SpringBoot 2.0.1.Gatling

Gatling不使用SpringBoot 2.0.1.Gatling
EN

Stack Overflow用户
提问于 2018-05-08 00:28:19
回答 1查看 1.2K关注 0票数 0

我正在尝试用Spring 2.0.1安装Gatling。

我创建了这个api:

代码语言:javascript
复制
@RestController
@RequestMapping("/contact")
public class ContactController {

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

这个基本的模拟:

代码语言:javascript
复制
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是这样配置的:

代码语言:javascript
复制
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",
    ]
}

在执行测试时:

代码语言:javascript
复制
./gradlew loadTest

我得到了以下堆栈跟踪:

代码语言:javascript
复制
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创建相同的项目,那么project 就能很好地工作。我怀疑spring-boot-gradle-plugin,因为它会根据SpringBoot版本而改变。

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

如果有人能帮我,我会很感激的!

EN

回答 1

Stack Overflow用户

发布于 2018-05-09 02:05:03

我已经解决了这个问题。

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

我进行降级是为了使用与SpringBoot 1.5.12相同的版本,version 4.0.51.Final。我必须将这个配置添加到build.gradle

代码语言:javascript
复制
{
// 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版本,我建议您这样做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50224156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档