You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2019/09/26 21:44:29 UTC
[tomcat] 04/04: Add throwOnFailure to LifecycleBase.
This is an automated email from the ASF dual-hosted git repository.
markt pushed a commit to branch 7.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit d0685f927186da2e0be56c28371e5207ee09ed20
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Fri Oct 7 08:54:34 2016 +0000
Add throwOnFailure to LifecycleBase.
Defaults to no change to current behaviour.
---
java/org/apache/catalina/util/LifecycleBase.java | 64 ++++++++++++++++++------
1 file changed, 50 insertions(+), 14 deletions(-)
diff --git a/java/org/apache/catalina/util/LifecycleBase.java b/java/org/apache/catalina/util/LifecycleBase.java
index 6195768..4b9bc2a 100644
--- a/java/org/apache/catalina/util/LifecycleBase.java
+++ b/java/org/apache/catalina/util/LifecycleBase.java
@@ -53,6 +53,37 @@ public abstract class LifecycleBase implements Lifecycle {
private volatile LifecycleState state = LifecycleState.NEW;
+ private boolean throwOnFailure = true;
+
+
+ /**
+ * Will a {@link LifecycleException} thrown by a sub-class during
+ * {@link #initInternal()}, {@link #startInternal()},
+ * {@link #stopInternal()} or {@link #destroyInternal()} be re-thrown for
+ * the caller to handle or will it be logged instead?
+ *
+ * @return {@code true} if the exception will be re-thrown, otherwise
+ * {@code false}
+ */
+ public boolean getThrowOnFailure() {
+ return throwOnFailure;
+ }
+
+
+ /**
+ * Configure if a {@link LifecycleException} thrown by a sub-class during
+ * {@link #initInternal()}, {@link #startInternal()},
+ * {@link #stopInternal()} or {@link #destroyInternal()} will be re-thrown
+ * for the caller to handle or if it will be logged instead.
+ *
+ * @param throwOnFailure {@code true} if the exception should be re-thrown,
+ * otherwise {@code false}
+ */
+ public void setThrowOnFailure(boolean throwOnFailure) {
+ this.throwOnFailure = throwOnFailure;
+ }
+
+
/**
* {@inheritDoc}
*/
@@ -105,10 +136,7 @@ public abstract class LifecycleBase implements Lifecycle {
initInternal();
setStateInternal(LifecycleState.INITIALIZED, null, false);
} catch (Throwable t) {
- ExceptionUtils.handleThrowable(t);
- setStateInternal(LifecycleState.FAILED, null, false);
- throw new LifecycleException(
- sm.getString("lifecycleBase.initFail",toString()), t);
+ handleSubClassException(t, "lifecycleBase.initFail", toString());
}
}
@@ -167,9 +195,7 @@ public abstract class LifecycleBase implements Lifecycle {
} catch (Throwable t) {
// This is an 'uncontrolled' failure so put the component into the
// FAILED state and throw an exception.
- ExceptionUtils.handleThrowable(t);
- setStateInternal(LifecycleState.FAILED, null, false);
- throw new LifecycleException(sm.getString("lifecycleBase.startFail", toString()), t);
+ handleSubClassException(t, "lifecycleBase.startFail", toString());
}
}
@@ -238,9 +264,7 @@ public abstract class LifecycleBase implements Lifecycle {
setStateInternal(LifecycleState.STOPPED, null, false);
} catch (Throwable t) {
- ExceptionUtils.handleThrowable(t);
- setStateInternal(LifecycleState.FAILED, null, false);
- throw new LifecycleException(sm.getString("lifecycleBase.stopFail",toString()), t);
+ handleSubClassException(t, "lifecycleBase.stopFail", toString());
} finally {
if (this instanceof Lifecycle.SingleUse) {
// Complete stop process first
@@ -297,10 +321,7 @@ public abstract class LifecycleBase implements Lifecycle {
destroyInternal();
setStateInternal(LifecycleState.DESTROYED, null, false);
} catch (Throwable t) {
- ExceptionUtils.handleThrowable(t);
- setStateInternal(LifecycleState.FAILED, null, false);
- throw new LifecycleException(
- sm.getString("lifecycleBase.destroyFail",toString()), t);
+ handleSubClassException(t, "lifecycleBase.destroyFail", toString());
}
}
@@ -408,4 +429,19 @@ public abstract class LifecycleBase implements Lifecycle {
String msg = sm.getString("lifecycleBase.invalidTransition", type, toString(), state);
throw new LifecycleException(msg);
}
+
+
+ private void handleSubClassException(Throwable t, String key, Object... args) throws LifecycleException {
+ ExceptionUtils.handleThrowable(t);
+ setStateInternal(LifecycleState.FAILED, null, false);
+ String msg = sm.getString(key, args);
+ if (getThrowOnFailure()) {
+ if (!(t instanceof LifecycleException)) {
+ t = new LifecycleException(msg, t);
+ }
+ throw (LifecycleException) t;
+ } else {
+ log.error(msg, t);
+ }
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org