From d35844792079b737295b190bdd4b80bc9a40e7a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arnaud=20Cogolu=C3=A8gnes?= <514737+acogoluegnes@users.noreply.github.com> Date: Mon, 4 Aug 2025 15:59:15 +0200 Subject: [PATCH] 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 (cherry picked from commit 74f538dd629c83ac846b9d2b97f3d11c421c2186) Conflicts: pom.xml src/main/java/com/rabbitmq/client/ConnectionFactory.java src/main/java/com/rabbitmq/client/impl/AMQConnection.java src/main/java/com/rabbitmq/client/impl/HeartbeatSender.java src/main/java/com/rabbitmq/client/impl/Utils.java src/test/java/com/rabbitmq/client/test/ClientTestSuite.java src/test/java/com/rabbitmq/client/test/TestUtils.java src/test/java/com/rabbitmq/client/test/functional/Heartbeat.java src/test/java/com/rabbitmq/client/test/ssl/SslContextFactoryTest.java src/test/java/com/rabbitmq/client/test/ssl/VerifiedConnection.java --- .github/workflows/test-rabbitmq-alphas.yml | 6 +- .../test-supported-java-versions-main.yml | 6 +- .github/workflows/test.yml | 7 +- pom.xml | 59 +- .../rabbitmq/client/ConnectionFactory.java | 3141 +++++++++-------- .../client/SocketChannelConfigurator.java | 5 + .../client/SocketChannelConfigurators.java | 2 + .../client/SslEngineConfigurator.java | 5 + .../client/SslEngineConfigurators.java | 2 + .../rabbitmq/client/impl/AMQConnection.java | 19 +- .../client/impl/DefaultHeartbeatSender.java | 147 + .../java/com/rabbitmq/client/impl/Frame.java | 30 +- .../rabbitmq/client/impl/FrameHandler.java | 9 + .../rabbitmq/client/impl/HeartbeatSender.java | 137 +- .../client/impl/NettyFrameHandlerFactory.java | 532 +++ .../java/com/rabbitmq/client/impl/Utils.java | 45 +- .../rabbitmq/client/impl/nio/NioContext.java | 2 + .../rabbitmq/client/impl/nio/NioParams.java | 4 + .../rabbitmq/client/impl/nio/NioQueue.java | 2 + .../client/AmqpClientTestExtension.java | 119 +- .../AMQConnectionRefreshCredentialsTest.java | 5 +- .../client/test/BlockedConnectionTest.java | 13 +- .../rabbitmq/client/test/BrokerTestCase.java | 2 +- .../rabbitmq/client/test/ClientTestSuite.java | 5 +- .../com/rabbitmq/client/test/FrameTest.java | 9 +- .../com/rabbitmq/client/test/NettyTest.java | 143 + ...NoAutoRecoveryWhenTcpWindowIsFullTest.java | 2 +- .../client/test/ProtocolVersionMismatch.java | 92 + .../com/rabbitmq/client/test/TestUtils.java | 980 ++--- .../client/test/functional/FrameMax.java | 86 +- .../test/functional/FunctionalTestSuite.java | 112 +- .../client/test/functional/Heartbeat.java | 71 +- .../test/functional/UnexpectedFrames.java | 6 +- .../test/ssl/BadVerifiedConnection.java | 2 + .../client/test/ssl/HostnameVerification.java | 19 +- .../test/{ => ssl}/SslContextFactoryTest.java | 46 +- .../client/test/ssl/SslTestSuite.java | 2 - .../client/test/ssl/TlsConnectionLogging.java | 43 +- .../client/test/ssl/TlsTestUtils.java | 45 + .../client/test/ssl/UnverifiedConnection.java | 3 + .../client/test/ssl/VerifiedConnection.java | 53 +- src/test/resources/logback-test.xml | 3 +- 42 files changed, 3666 insertions(+), 2355 deletions(-) create mode 100644 src/main/java/com/rabbitmq/client/impl/DefaultHeartbeatSender.java create mode 100644 src/main/java/com/rabbitmq/client/impl/NettyFrameHandlerFactory.java create mode 100644 src/test/java/com/rabbitmq/client/test/NettyTest.java create mode 100644 src/test/java/com/rabbitmq/client/test/ProtocolVersionMismatch.java rename src/test/java/com/rabbitmq/client/test/{ => ssl}/SslContextFactoryTest.java (76%) diff --git a/.github/workflows/test-rabbitmq-alphas.yml b/.github/workflows/test-rabbitmq-alphas.yml index 692ed30679..359696bbeb 100644 --- a/.github/workflows/test-rabbitmq-alphas.yml +++ b/.github/workflows/test-rabbitmq-alphas.yml @@ -43,9 +43,9 @@ jobs: RABBITMQ_IMAGE: ${{ matrix.rabbitmq-image }} - name: Get dependencies run: make deps - - name: Test with NIO + - name: Test with Netty run: | - ./mvnw verify -P use-nio -Drabbitmqctl.bin=DOCKER:rabbitmq0 \ + ./mvnw verify -Dio.layer=netty -Drabbitmqctl.bin=DOCKER:rabbitmq0 \ -Dtest-broker.A.nodename=rabbit@node0 -Dtest-broker.B.nodename=rabbit@node1 \ -Dca.certificate=./tls-gen/basic/result/ca_certificate.pem \ -Dclient.certificate=./tls-gen/basic/result/client_$(hostname)_certificate.pem \ @@ -53,7 +53,7 @@ jobs: --no-transfer-progress - name: Test with blocking IO run: | - ./mvnw verify -Drabbitmqctl.bin=DOCKER:rabbitmq0 \ + ./mvnw verify -Dio.layer=socket -Drabbitmqctl.bin=DOCKER:rabbitmq0 \ -Dtest-broker.A.nodename=rabbit@node0 -Dtest-broker.B.nodename=rabbit@node1 \ -Dca.certificate=./tls-gen/basic/result/ca_certificate.pem \ -Dclient.certificate=./tls-gen/basic/result/client_$(hostname)_certificate.pem \ diff --git a/.github/workflows/test-supported-java-versions-main.yml b/.github/workflows/test-supported-java-versions-main.yml index a5428233eb..24ad14034c 100644 --- a/.github/workflows/test-supported-java-versions-main.yml +++ b/.github/workflows/test-supported-java-versions-main.yml @@ -39,9 +39,9 @@ jobs: run: make deps - name: Show version run: ./mvnw --version - - name: Test with NIO + - name: Test with Netty run: | - ./mvnw verify -P use-nio -Drabbitmqctl.bin=DOCKER:rabbitmq \ + ./mvnw verify -Dio.layer=netty -Drabbitmqctl.bin=DOCKER:rabbitmq \ -Dtest-broker.A.nodename=rabbit@$(hostname) -Dmaven.javadoc.skip=true \ -Dca.certificate=./tls-gen/basic/result/ca_certificate.pem \ -Dclient.certificate=./tls-gen/basic/result/client_$(hostname)_certificate.pem \ @@ -49,7 +49,7 @@ jobs: --no-transfer-progress - name: Test with blocking IO run: | - ./mvnw verify -Drabbitmqctl.bin=DOCKER:rabbitmq \ + ./mvnw verify -Dio.layer=socket -Drabbitmqctl.bin=DOCKER:rabbitmq \ -Dtest-broker.A.nodename=rabbit@$(hostname) -Dmaven.javadoc.skip=true \ -Dca.certificate=./tls-gen/basic/result/ca_certificate.pem \ -Dclient.certificate=./tls-gen/basic/result/client_$(hostname)_certificate.pem \ diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 97c0ab4361..dd50be0bfe 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -39,9 +39,9 @@ jobs: run: ci/start-cluster.sh - name: Get dependencies run: make deps - - name: Test with NIO + - name: Test with Netty run: | - ./mvnw verify -P use-nio -Drabbitmqctl.bin=DOCKER:rabbitmq0 \ + ./mvnw verify -Dio.layer=netty -Drabbitmqctl.bin=DOCKER:rabbitmq0 \ -Dtest-broker.A.nodename=rabbit@node0 -Dtest-broker.B.nodename=rabbit@node1 \ -Dca.certificate=./tls-gen/basic/result/ca_certificate.pem \ -Dclient.certificate=./tls-gen/basic/result/client_$(hostname)_certificate.pem \ @@ -49,12 +49,11 @@ jobs: --no-transfer-progress - name: Test with blocking IO run: | - ./mvnw verify -Drabbitmqctl.bin=DOCKER:rabbitmq0 \ + ./mvnw verify -Dio.layer=socket -Drabbitmqctl.bin=DOCKER:rabbitmq0 \ -Dtest-broker.A.nodename=rabbit@node0 -Dtest-broker.B.nodename=rabbit@node1 \ -Dca.certificate=./tls-gen/basic/result/ca_certificate.pem \ -Dclient.certificate=./tls-gen/basic/result/client_$(hostname)_certificate.pem \ -Dmaven.javadoc.skip=true \ - -Dtest-client-cert.password= -Dtest-tls-certs.dir=rabbitmq-configuration/tls \ --no-transfer-progress - name: Stop cluster run: docker compose --file ci/cluster/docker-compose.yml down diff --git a/pom.xml b/pom.xml index fb92222c22..531e6837b4 100644 --- a/pom.xml +++ b/pom.xml @@ -56,6 +56,7 @@ true 1.7.36 + 4.2.3.Final 4.2.33 1.15.2 1.52.0 @@ -245,30 +246,6 @@ - - - use-nio - - - - org.apache.maven.plugins - maven-failsafe-plugin - ${maven.failsafe.plugin.version} - - - true - true - - ${test-arguments} - - - - - -