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**
This commit is contained in:
Gary Russell
2020-10-22 13:57:12 -04:00
committed by Artem Bilan
parent 14dee1f16a
commit 310f95098e
5 changed files with 24 additions and 26 deletions

View File

@@ -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);
}

View File

@@ -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;
}
}

View File

@@ -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

View File

@@ -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)

View File

@@ -38,7 +38,8 @@ See <<template-confirms>> 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 <<containerAttributes>> for more information.