Gatling and Netty version conflicts

Hi All-

I’m a new gatling(v2.3.1) user who is trying to use gatling to test a spring webflux application.

I’m getting the following error, and I believe it’s because async-http-client version 2.0.39 has it’s own set of netty classes.

I’m using the com.github.lkishalmi.gatling gradle plugin(v0.7.1). Is there any way to force gatling to use a later version of async-http-client, which seems to not have the same problem?

thanks
Michael Kohout

12:25:07.529 [GatlingSystem-akka.actor.default-dispatcher-2] ERROR io.gatling.core.action.SingletonFeed - Actor io.gatling.core.action.SingletonFeed@4eee70c6 crashed on message Some(FeedMessage(Session(basic lookup works,1,Map(gatling.http.cache.dns → io.gatling.http.resolver.ShuffleJdkNameResolver@1da9af62),1522085107500,0,OK,List(),io.gatling.core.protocol.ProtocolComponentsRegistry$$Lambda$529/79283217@2652f539),io.gatling.core.session.package$ExpressionSuccessWrapper$$$Lambda$332/1612031141@71ca83dd,Actor[akka://GatlingSystem/user/gatling-controller#-538863318],io.gatling.http.action.sync.HttpRequestAction@4c1fb562))
io.netty.channel.ChannelException: Unable to create Channel from class class io.netty.channel.socket.nio.NioSocketChannel
at io.netty.channel.ReflectiveChannelFactory.newChannel(ReflectiveChannelFactory.java:41) ~[netty-resolver-dns-2.0.39.jar:4.1.17.Final]
at io.netty.bootstrap.AbstractBootstrap.initAndRegister(AbstractBootstrap.java:320) ~[netty-transport-4.1.17.Final.jar:4.1.17.Final]
at io.netty.bootstrap.Bootstrap.doResolveAndConnect(Bootstrap.java:163) ~[netty-transport-4.1.17.Final.jar:4.1.17.Final]
at io.netty.bootstrap.Bootstrap.connect(Bootstrap.java:119) ~[netty-transport-4.1.17.Final.jar:4.1.17.Final]
at io.netty.channel.pool.SimpleChannelPool.connectChannel(SimpleChannelPool.java:266) ~[netty-transport-4.1.17.Final.jar:4.1.17.Final]
at io.netty.channel.pool.SimpleChannelPool.acquireHealthyFromPoolOrNew(SimpleChannelPool.java:179) ~[netty-transport-4.1.17.Final.jar:4.1.17.Final]
at io.netty.channel.pool.SimpleChannelPool.acquire(SimpleChannelPool.java:164) ~[netty-transport-4.1.17.Final.jar:4.1.17.Final]
at io.netty.channel.pool.SimpleChannelPool.acquire(SimpleChannelPool.java:158) ~[netty-transport-4.1.17.Final.jar:4.1.17.Final]
at reactor.ipc.netty.resources.DefaultPoolResources$Pool.acquire(DefaultPoolResources.java:124) ~[reactor-netty-0.7.2.RELEASE.jar:0.7.2.RELEASE]
at reactor.ipc.netty.tcp.TcpClient.lambda$newHandler$1(TcpClient.java:197) ~[reactor-netty-0.7.2.RELEASE.jar:0.7.2.RELEASE]
at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:53) ~[reactor-core-3.1.4.RELEASE.jar:3.1.4.RELEASE]
at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52) ~[reactor-core-3.1.4.RELEASE.jar:3.1.4.RELEASE]
at reactor.core.publisher.Mono.subscribe(Mono.java:3077) ~[reactor-core-3.1.4.RELEASE.jar:3.1.4.RELEASE]
at reactor.core.publisher.FluxRetryPredicate$RetryPredicateSubscriber.resubscribe(FluxRetryPredicate.java:123) ~[reactor-core-3.1.4.RELEASE.jar:3.1.4.RELEASE]
at reactor.core.publisher.MonoRetryPredicate.subscribe(MonoRetryPredicate.java:51) ~[reactor-core-3.1.4.RELEASE.jar:3.1.4.RELEASE]
at reactor.core.publisher.MonoMap.subscribe(MonoMap.java:55) ~[reactor-core-3.1.4.RELEASE.jar:3.1.4.RELEASE]
at reactor.ipc.netty.http.client.MonoHttpClientResponse.subscribe(MonoHttpClientResponse.java:79) ~[reactor-netty-0.7.2.RELEASE.jar:0.7.2.RELEASE]
at reactor.core.publisher.MonoMap.subscribe(MonoMap.java:55) ~[reactor-core-3.1.4.RELEASE.jar:3.1.4.RELEASE]
at reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71) ~[reactor-core-3.1.4.RELEASE.jar:3.1.4.RELEASE]
at reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71) ~[reactor-core-3.1.4.RELEASE.jar:3.1.4.RELEASE]
at reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71) ~[reactor-core-3.1.4.RELEASE.jar:3.1.4.RELEASE]
at reactor.core.publisher.MonoMap.subscribe(MonoMap.java:55) ~[reactor-core-3.1.4.RELEASE.jar:3.1.4.RELEASE]
at reactor.core.publisher.MonoSwitchIfEmpty.subscribe(MonoSwitchIfEmpty.java:44) ~[reactor-core-3.1.4.RELEASE.jar:3.1.4.RELEASE]
at reactor.core.publisher.MonoFlatMapMany.subscribe(MonoFlatMapMany.java:49) ~[reactor-core-3.1.4.RELEASE.jar:3.1.4.RELEASE]
at reactor.core.publisher.FluxTake.subscribe(FluxTake.java:56) ~[reactor-core-3.1.4.RELEASE.jar:3.1.4.RELEASE]
at reactor.core.publisher.FluxMap.subscribe(FluxMap.java:62) ~[reactor-core-3.1.4.RELEASE.jar:3.1.4.RELEASE]
at reactor.core.publisher.Flux.subscribe(Flux.java:6869) ~[reactor-core-3.1.4.RELEASE.jar:3.1.4.RELEASE]
at reactor.core.publisher.BlockingIterable.iterator(BlockingIterable.java:80) ~[reactor-core-3.1.4.RELEASE.jar:3.1.4.RELEASE]
at scala.collection.convert.Wrappers$JIterableWrapper.iterator(Wrappers.scala:51) ~[scala-library-2.12.4.jar:?]
at offerComparator.Comparator.$anonfun$skuFeeder$1(Comparator.scala:38) ~[gatling/:?]
at io.gatling.core.action.builder.FeedBuilder.newSingletonFeed(FeedBuilder.scala:38) ~[gatling-core-2.3.1.jar:2.3.1]
at io.gatling.core.action.builder.FeedBuilder.$anonfun$build$1(FeedBuilder.scala:43) ~[gatling-core-2.3.1.jar:2.3.1]
at scala.collection.mutable.HashMap.getOrElseUpdate(HashMap.scala:82) ~[scala-library-2.12.4.jar:?]
at io.gatling.core.action.builder.FeedBuilder.build(FeedBuilder.scala:43) ~[gatling-core-2.3.1.jar:2.3.1]
at io.gatling.core.structure.StructureBuilder.$anonfun$build$1(StructureBuilder.scala:34) ~[gatling-core-2.3.1.jar:2.3.1]
at scala.collection.LinearSeqOptimized.foldLeft(LinearSeqOptimized.scala:122) ~[scala-library-2.12.4.jar:?]
at scala.collection.LinearSeqOptimized.foldLeft$(LinearSeqOptimized.scala:118) ~[scala-library-2.12.4.jar:?]
at scala.collection.immutable.List.foldLeft(List.scala:86) ~[scala-library-2.12.4.jar:?]
at io.gatling.core.structure.StructureBuilder.build(StructureBuilder.scala:33) ~[gatling-core-2.3.1.jar:2.3.1]
at io.gatling.core.structure.StructureBuilder.build$(StructureBuilder.scala:32) ~[gatling-core-2.3.1.jar:2.3.1]
at io.gatling.core.structure.ScenarioBuilder.build(ScenarioBuilder.scala:38) ~[gatling-core-2.3.1.jar:2.3.1]
at io.gatling.core.structure.PopulationBuilder.build(ScenarioBuilder.scala:98) ~[gatling-core-2.3.1.jar:2.3.1]
at io.gatling.core.scenario.SimulationParams.$anonfun$scenarios$1(Simulation.scala:188) ~[gatling-core-2.3.1.jar:2.3.1]
at scala.collection.immutable.List.map(List.scala:283) ~[scala-library-2.12.4.jar:?]
at io.gatling.core.scenario.SimulationParams.scenarios(Simulation.scala:188) ~[gatling-core-2.3.1.jar:2.3.1]
at io.gatling.app.Runner.run0(Runner.scala:95) ~[gatling-app-2.3.1.jar:2.3.1]
at io.gatling.app.Runner.run(Runner.scala:64) ~[gatling-app-2.3.1.jar:2.3.1]
at io.gatling.app.Gatling$.start(Gatling.scala:63) ~[gatling-app-2.3.1.jar:2.3.1]
at io.gatling.app.Gatling$.fromArgs(Gatling.scala:45) ~[gatling-app-2.3.1.jar:2.3.1]
at io.gatling.app.Gatling$.main(Gatling.scala:37) ~[gatling-app-2.3.1.jar:2.3.1]
at io.gatling.app.Gatling.main(Gatling.scala) ~[gatling-app-2.3.1.jar:2.3.1]
Caused by: java.lang.NoSuchMethodError: io.netty.channel.DefaultChannelId.newInstance()Lio/netty/channel/DefaultChannelId;
at io.netty.channel.AbstractChannel.newId(AbstractChannel.java:111) ~[netty-transport-4.1.17.Final.jar:4.1.17.Final]

You’re the one messing up with dependency versions. Both Gatling 2.3.1 and AHC 2.0.39 depends on Netty 4.0.56.
You can’t force Netty 4.1.17.

That won’t probably work. Feeder is Iterator[Map[String, Any]] and it’s not intended to block/be suspended.