Skip to content

Commit 74f538d

Browse files
committed
Add Netty-based frame handler
This commit adds a Netty-based frame handler. All network IO are based on Netty when this frame handler is in use. The client library can benefit of all the flexibility and advantages of Netty: simple API, pluggable IO layer (Java NIO by default, or e.g. native Epoll on Linux). The Netty frame handler deprecates the internal one using Java NIO. The blocking IO frame handler is still the default one in 5.x. The Netty frame handler should be the only one in 6.x. Fixes #1664
1 parent d4bb4e5 commit 74f538d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+3755
-2458
lines changed

.github/workflows/test-rabbitmq-alphas.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,17 +43,17 @@ jobs:
4343
RABBITMQ_IMAGE: ${{ matrix.rabbitmq-image }}
4444
- name: Get dependencies
4545
run: make deps
46-
- name: Test with NIO
46+
- name: Test with Netty
4747
run: |
48-
./mvnw verify -P use-nio -Drabbitmqctl.bin=DOCKER:rabbitmq0 \
48+
./mvnw verify -Dio.layer=netty -Drabbitmqctl.bin=DOCKER:rabbitmq0 \
4949
-Dtest-broker.A.nodename=rabbit@node0 -Dtest-broker.B.nodename=rabbit@node1 \
5050
-Dca.certificate=./tls-gen/basic/result/ca_certificate.pem \
5151
-Dclient.certificate=./tls-gen/basic/result/client_$(hostname)_certificate.pem \
5252
-Dmaven.javadoc.skip=true \
5353
--no-transfer-progress
5454
- name: Test with blocking IO
5555
run: |
56-
./mvnw verify -Drabbitmqctl.bin=DOCKER:rabbitmq0 \
56+
./mvnw verify -Dio.layer=socket -Drabbitmqctl.bin=DOCKER:rabbitmq0 \
5757
-Dtest-broker.A.nodename=rabbit@node0 -Dtest-broker.B.nodename=rabbit@node1 \
5858
-Dca.certificate=./tls-gen/basic/result/ca_certificate.pem \
5959
-Dclient.certificate=./tls-gen/basic/result/client_$(hostname)_certificate.pem \

.github/workflows/test-supported-java-versions-main.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@ jobs:
3939
run: make deps
4040
- name: Show version
4141
run: ./mvnw --version
42-
- name: Test with NIO
42+
- name: Test with Netty
4343
run: |
44-
./mvnw verify -P use-nio -Drabbitmqctl.bin=DOCKER:rabbitmq \
44+
./mvnw verify -Dio.layer=netty -Drabbitmqctl.bin=DOCKER:rabbitmq \
4545
-Dtest-broker.A.nodename=rabbit@$(hostname) -Dmaven.javadoc.skip=true \
4646
-Dca.certificate=./tls-gen/basic/result/ca_certificate.pem \
4747
-Dclient.certificate=./tls-gen/basic/result/client_$(hostname)_certificate.pem \
@@ -50,7 +50,7 @@ jobs:
5050
-Dnet.bytebuddy.experimental=true
5151
- name: Test with blocking IO
5252
run: |
53-
./mvnw verify -Drabbitmqctl.bin=DOCKER:rabbitmq \
53+
./mvnw verify -Dio.layer=socket -Drabbitmqctl.bin=DOCKER:rabbitmq \
5454
-Dtest-broker.A.nodename=rabbit@$(hostname) -Dmaven.javadoc.skip=true \
5555
-Dca.certificate=./tls-gen/basic/result/ca_certificate.pem \
5656
-Dclient.certificate=./tls-gen/basic/result/client_$(hostname)_certificate.pem \

.github/workflows/test.yml

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,22 +39,21 @@ jobs:
3939
run: ci/start-cluster.sh
4040
- name: Get dependencies
4141
run: make deps
42-
- name: Test with NIO
42+
- name: Test with Netty
4343
run: |
44-
./mvnw verify -P use-nio -Drabbitmqctl.bin=DOCKER:rabbitmq0 \
44+
./mvnw verify -Dio.layer=netty -Drabbitmqctl.bin=DOCKER:rabbitmq0 \
4545
-Dtest-broker.A.nodename=rabbit@node0 -Dtest-broker.B.nodename=rabbit@node1 \
4646
-Dca.certificate=./tls-gen/basic/result/ca_certificate.pem \
4747
-Dclient.certificate=./tls-gen/basic/result/client_$(hostname)_certificate.pem \
4848
-Dmaven.javadoc.skip=true \
4949
--no-transfer-progress
5050
- name: Test with blocking IO
5151
run: |
52-
./mvnw verify -Drabbitmqctl.bin=DOCKER:rabbitmq0 \
52+
./mvnw verify -Dio.layer=socket -Drabbitmqctl.bin=DOCKER:rabbitmq0 \
5353
-Dtest-broker.A.nodename=rabbit@node0 -Dtest-broker.B.nodename=rabbit@node1 \
5454
-Dca.certificate=./tls-gen/basic/result/ca_certificate.pem \
5555
-Dclient.certificate=./tls-gen/basic/result/client_$(hostname)_certificate.pem \
5656
-Dmaven.javadoc.skip=true \
57-
-Dtest-client-cert.password= -Dtest-tls-certs.dir=rabbitmq-configuration/tls \
5857
--no-transfer-progress
5958
- name: Stop cluster
6059
run: docker compose --file ci/cluster/docker-compose.yml down

pom.xml

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656

5757
<spotless.check.skip>true</spotless.check.skip>
5858
<slf4j.version>1.7.36</slf4j.version>
59+
<netty.version>4.2.3.Final</netty.version>
5960
<metrics.version>4.2.33</metrics.version>
6061
<micrometer.version>1.15.2</micrometer.version>
6162
<opentelemetry.version>1.52.0</opentelemetry.version>
@@ -245,30 +246,6 @@
245246
</build>
246247
</profile>
247248

248-
<!--
249-
Profile to activate the NIO mode in the test suite:
250-
mvn verify -P use-nio
251-
-->
252-
<profile>
253-
<id>use-nio</id>
254-
<build>
255-
<plugins>
256-
<plugin>
257-
<groupId>org.apache.maven.plugins</groupId>
258-
<artifactId>maven-failsafe-plugin</artifactId>
259-
<version>${maven.failsafe.plugin.version}</version>
260-
<configuration>
261-
<systemPropertyVariables>
262-
<net.bytebuddy.experimental>true</net.bytebuddy.experimental>
263-
<use.nio>true</use.nio>
264-
</systemPropertyVariables>
265-
<argLine>${test-arguments}</argLine>
266-
</configuration>
267-
</plugin>
268-
</plugins>
269-
</build>
270-
</profile>
271-
272249
<profile>
273250
<!--
274251
The "snapshots" Maven profile is used to push release artifacts to a
@@ -401,6 +378,21 @@
401378
<artifactId>slf4j-api</artifactId>
402379
<version>${slf4j.version}</version>
403380
</dependency>
381+
<dependency>
382+
<groupId>io.netty</groupId>
383+
<artifactId>netty-transport</artifactId>
384+
<version>${netty.version}</version>
385+
</dependency>
386+
<dependency>
387+
<groupId>io.netty</groupId>
388+
<artifactId>netty-codec</artifactId>
389+
<version>${netty.version}</version>
390+
</dependency>
391+
<dependency>
392+
<groupId>io.netty</groupId>
393+
<artifactId>netty-handler</artifactId>
394+
<version>${netty.version}</version>
395+
</dependency>
404396
<dependency>
405397
<groupId>io.dropwizard.metrics</groupId>
406398
<artifactId>metrics-core</artifactId>
@@ -509,6 +501,20 @@
509501
<scope>test</scope>
510502
<optional>true</optional>
511503
</dependency>
504+
<dependency>
505+
<groupId>io.netty</groupId>
506+
<artifactId>netty-transport-native-kqueue</artifactId>
507+
<version>${netty.version}</version>
508+
<classifier>osx-aarch_64</classifier>
509+
<scope>test</scope>
510+
</dependency>
511+
<dependency>
512+
<groupId>io.netty</groupId>
513+
<artifactId>netty-transport-native-epoll</artifactId>
514+
<version>${netty.version}</version>
515+
<classifier>linux-x86_64</classifier>
516+
<scope>test</scope>
517+
</dependency>
512518

513519
</dependencies>
514520

@@ -768,8 +774,13 @@
768774
<configuration>
769775
<java>
770776
<includes>
777+
<include>src/main/java/com/rabbitmq/client/ConnectionFactory.java</include>
778+
<include>src/main/java/com/rabbitmq/client/impl/NettyFrameHandlerFactory.java</include>
771779
<include>src/main/java/com/rabbitmq/client/observation/**/*.java</include>
772780
<include>src/test/java/com/rabbitmq/client/test/functional/MicrometerObservationCollectorMetrics.java</include>
781+
<include>src/test/java/com/rabbitmq/client/test/NettyTest.java</include>
782+
<include>src/test/java/com/rabbitmq/client/test/ProtocolVersionMismatch.java</include>
783+
<include>src/test/java/com/rabbitmq/client/test/TestUtils.java</include>
773784
</includes>
774785
<googleJavaFormat>
775786
<version>${google-java-format.version}</version>

0 commit comments

Comments
 (0)