This is an automated email from the ASF dual-hosted git repository. rouazana pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 52e3cea8d9c991613b8ab0b9217793cdd2e95b95 Author: Benoit Tellier <[email protected]> AuthorDate: Fri Nov 22 17:18:07 2019 +0700 JAMES-2937 Calling several time the RabbitMQ endpoint should not fail Channel was not given back to the pool, causing repeated calling of this endpoint to fail --- .../rabbitmq/ReactorRabbitMQChannelPool.java | 23 +++++++++++++++------- .../backends/rabbitmq/RabbitMQHealthCheckTest.java | 14 +++++++++++++ .../integration/WebAdminServerIntegrationTest.java | 14 +++++++++++++ 3 files changed, 44 insertions(+), 7 deletions(-) diff --git a/backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/ReactorRabbitMQChannelPool.java b/backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/ReactorRabbitMQChannelPool.java index 645a68a..a5dbea6 100644 --- a/backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/ReactorRabbitMQChannelPool.java +++ b/backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/ReactorRabbitMQChannelPool.java @@ -137,12 +137,14 @@ public class ReactorRabbitMQChannelPool implements ChannelPool, Startable { @Override public Mono<? extends Channel> getChannelMono() { - return Mono.fromCallable(() -> { - Channel channel = pool.borrowObject(MAXIMUM_BORROW_TIMEOUT_IN_MS); - Preconditions.checkArgument(channel.isOpen()); - borrowedChannels.add(channel); - return channel; - }); + return Mono.fromCallable(this::borrow); + } + + private Channel borrow() throws Exception { + Channel channel = pool.borrowObject(MAXIMUM_BORROW_TIMEOUT_IN_MS); + Preconditions.checkArgument(channel.isOpen()); + borrowedChannels.add(channel); + return channel; } @Override @@ -186,10 +188,17 @@ public class ReactorRabbitMQChannelPool implements ChannelPool, Startable { } public boolean tryChannel() { + Channel channel = null; try { - return getChannelMono().block().isOpen(); + channel = borrow(); + return channel.isOpen(); } catch (Throwable t) { return false; + } finally { + if (channel != null) { + borrowedChannels.remove(channel); + pool.returnObject(channel); + } } } } diff --git a/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQHealthCheckTest.java b/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQHealthCheckTest.java index 9f1d9f8..769741a 100644 --- a/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQHealthCheckTest.java +++ b/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQHealthCheckTest.java @@ -52,6 +52,20 @@ class RabbitMQHealthCheckTest { } @Test + void checkShouldReturnHealthyWhenCalledSeveralTime() { + healthCheck.check(); + healthCheck.check(); + healthCheck.check(); + healthCheck.check(); + healthCheck.check(); + healthCheck.check(); + healthCheck.check(); + Result check = healthCheck.check(); + + assertThat(check.isHealthy()).isTrue(); + } + + @Test void checkShouldReturnUnhealthyWhenRabbitMQIsNotRunning(DockerRabbitMQ rabbitMQ) throws Exception { rabbitMQ.stopApp(); diff --git a/server/protocols/webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/WebAdminServerIntegrationTest.java b/server/protocols/webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/WebAdminServerIntegrationTest.java index fe302ef..e60e848 100644 --- a/server/protocols/webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/WebAdminServerIntegrationTest.java +++ b/server/protocols/webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/WebAdminServerIntegrationTest.java @@ -126,6 +126,20 @@ public class WebAdminServerIntegrationTest { } @Test + public void healthCheckShouldReturn200WhenCalledRepeatedly() { + given().get(HealthCheckRoutes.HEALTHCHECK); + given().get(HealthCheckRoutes.HEALTHCHECK); + given().get(HealthCheckRoutes.HEALTHCHECK); + given().get(HealthCheckRoutes.HEALTHCHECK); + given().get(HealthCheckRoutes.HEALTHCHECK); + + when() + .get(HealthCheckRoutes.HEALTHCHECK) + .then() + .statusCode(HttpStatus.OK_200); + } + + @Test public void mailRepositoriesRoutesShouldBeExposed() { when() .get(MailRepositoriesRoutes.MAIL_REPOSITORIES) --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
