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:
committed by
Artem Bilan
parent
14dee1f16a
commit
310f95098e
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user