From 310f95098e9b07b783ae9fbcafceab1b6ae8f3bb Mon Sep 17 00:00:00 2001 From: Gary Russell Date: Thu, 22 Oct 2020 13:57:12 -0400 Subject: [PATCH] GH-1258: Change OOMHandler to JavaLangErrorHandler Resolves https://github.com/spring-projects/spring-amqp/issues/1258 Call the handler for all `Error`s on container threads. **I will do the cherry-pick; there will be conflicts** --- .../AbstractMessageListenerContainer.java | 20 +++++++++---------- .../DirectMessageListenerContainer.java | 4 ++-- .../SimpleMessageListenerContainer.java | 5 +---- src/reference/asciidoc/amqp.adoc | 18 ++++++++--------- src/reference/asciidoc/whats-new.adoc | 3 ++- 5 files changed, 24 insertions(+), 26 deletions(-) diff --git a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/listener/AbstractMessageListenerContainer.java b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/listener/AbstractMessageListenerContainer.java index 47ae8a2a..7d21d1a0 100644 --- a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/listener/AbstractMessageListenerContainer.java +++ b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/listener/AbstractMessageListenerContainer.java @@ -248,7 +248,7 @@ public abstract class AbstractMessageListenerContainer extends RabbitAccessor private long consumeDelay; - private OOMHandler oOMHandler = error -> System.exit(EXIT_99); + private JavaLangErrorHandler javaLangErrorHandler = error -> System.exit(EXIT_99); private volatile boolean lazyLoad; @@ -1149,19 +1149,19 @@ public abstract class AbstractMessageListenerContainer extends RabbitAccessor this.consumeDelay = consumeDelay; } - protected OOMHandler getOOMHandler() { - return this.oOMHandler; + protected JavaLangErrorHandler getJavaLangErrorHandler() { + return this.javaLangErrorHandler; } /** * Provide an OOMHandler implementation; by default, {@code System.exit(99)} is * called. - * @param oOMHandler the handler. + * @param javaLangErrorHandler the handler. * @since 2.2.12 */ - public void setOOMHandler(OOMHandler oOMHandler) { - Assert.notNull(oOMHandler, "'oOMHandler' cannot be null"); - this.oOMHandler = oOMHandler; + public void setjavaLangErrorHandler(JavaLangErrorHandler javaLangErrorHandler) { + Assert.notNull(javaLangErrorHandler, "'javaLangErrorHandler' cannot be null"); + this.javaLangErrorHandler = javaLangErrorHandler; } /** @@ -1992,18 +1992,18 @@ public abstract class AbstractMessageListenerContainer extends RabbitAccessor } /** - * A handler for {@link OutOfMemoryError} on the container thread(s). + * A handler for {@link Error} on the container thread(s). * @since 2.2.12 * */ @FunctionalInterface - public interface OOMHandler { + public interface JavaLangErrorHandler { /** * Handle the error; typically, the JVM will be terminated. * @param error the error. */ - void handle(OutOfMemoryError error); + void handle(Error error); } diff --git a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/listener/DirectMessageListenerContainer.java b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/listener/DirectMessageListenerContainer.java index 47343fab..23879ea9 100644 --- a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/listener/DirectMessageListenerContainer.java +++ b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/listener/DirectMessageListenerContainer.java @@ -1093,8 +1093,8 @@ public class DirectMessageListenerContainer extends AbstractMessageListenerConta } } } - catch (OutOfMemoryError e) { // NOSONAR - getOOMHandler().handle(e); + catch (Error e) { // NOSONAR + getJavaLangErrorHandler().handle(e); throw e; } } diff --git a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/listener/SimpleMessageListenerContainer.java b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/listener/SimpleMessageListenerContainer.java index 161338d9..6e15c827 100644 --- a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/listener/SimpleMessageListenerContainer.java +++ b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/listener/SimpleMessageListenerContainer.java @@ -1255,12 +1255,9 @@ public class SimpleMessageListenerContainer extends AbstractMessageListenerConta } } catch (Error e) { //NOSONAR - // ok to catch Error - we're aborting so will stop logger.error("Consumer thread error, thread abort.", e); - if (e instanceof OutOfMemoryError) { // NOSONAR - getOOMHandler().handle((OutOfMemoryError) e); - } publishConsumerFailedEvent("Consumer threw an Error", true, e); + getJavaLangErrorHandler().handle(e); aborted = true; } catch (Throwable t) { //NOSONAR diff --git a/src/reference/asciidoc/amqp.adoc b/src/reference/asciidoc/amqp.adoc index 15d8fadc..eb649774 100644 --- a/src/reference/asciidoc/amqp.adoc +++ b/src/reference/asciidoc/amqp.adoc @@ -5685,6 +5685,15 @@ a|image::images/tickmark.png[] a|image::images/tickmark.png[] a|image::images/tickmark.png[] +|javaLangErrorHandler +(N/A) + +|An `AbstractMessageListenerContainer.JavaLangErrorHandler` implementation that is called when a container thread catches an `Error`. +The default implementation calls `System.exit(99)`; to revert to the previous behavior (do nothing), add a no-op handler. + +a|image::images/tickmark.png[] +a|image::images/tickmark.png[] + |maxConcurrentConsumers (max-concurrency) @@ -5789,15 +5798,6 @@ a|image::images/tickmark.png[] a|image::images/tickmark.png[] a|image::images/tickmark.png[] -|oOMHandler -(N/A) - -|An `AbstractMessageListenerContainer.OOMHandler` implementation that is called when a container thread catches an `OutOfMemoryException`. -The default implementation calls `System.exit(99)`. - -a|image::images/tickmark.png[] -a|image::images/tickmark.png[] - |phase (phase) diff --git a/src/reference/asciidoc/whats-new.adoc b/src/reference/asciidoc/whats-new.adoc index df45b7da..26bbdb9c 100644 --- a/src/reference/asciidoc/whats-new.adoc +++ b/src/reference/asciidoc/whats-new.adoc @@ -38,7 +38,8 @@ See <> for more information. A new listener container property `consumeDelay` is now available; it is helpful when using the https://github.com/rabbitmq/rabbitmq-sharding[RabbitMQ Sharding Plugin]. -The default `OOMHandler` (out of memory handler) now calls `System.exit(99)`. +The default `JavaLangErrorHandler` now calls `System.exit(99)`. +To revert to the previous behavior (do nothing), add a no-op handler. See <> for more information.