Repository: logging-log4j2 Updated Branches: refs/heads/master 337941cc7 -> 9ff9be2e4
LOG4J2-1296 Simplified implementation of ReusableParameterizedMessage: no need to manage state in a ThreadLocal since ReusableMessageFactory will manage instances of this class in a ThreadLocal already Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/9ff9be2e Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/9ff9be2e Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/9ff9be2e Branch: refs/heads/master Commit: 9ff9be2e46651f1bfdd83ab04bfd9543141d9cea Parents: 337941c Author: rpopma <[email protected]> Authored: Tue Mar 8 20:34:14 2016 +1100 Committer: rpopma <[email protected]> Committed: Tue Mar 8 20:34:14 2016 +1100 ---------------------------------------------------------------------- .../message/ReusableParameterizedMessage.java | 231 ++++++++----------- 1 file changed, 102 insertions(+), 129 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9ff9be2e/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableParameterizedMessage.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableParameterizedMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableParameterizedMessage.java index 6ed4cb9..7d2b1d5 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableParameterizedMessage.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableParameterizedMessage.java @@ -21,7 +21,9 @@ import java.util.Arrays; import org.apache.logging.log4j.util.PerformanceSensitive; /** - * Reusable parameterized message. + * Reusable parameterized message. This message is mutable and is not safe to be accessed or modified by multiple + * threads concurrently. + * * @see ParameterizedMessage * @since 2.6 */ @@ -30,186 +32,160 @@ public class ReusableParameterizedMessage implements ReusableMessage { private static final long serialVersionUID = 7800075879295123856L; - static class InternalState { - private final StringBuilder buffer = new StringBuilder(2048); - private String messagePattern; - private int argCount; - private transient Object[] varargs; - private transient Object[] params = new Object[10]; - private transient Throwable throwable; - - private Object[] getTrimmedParams() { - return varargs == null ? Arrays.copyOf(params, argCount) : varargs; - } - - private Object[] getParams() { - return varargs == null ? params : varargs; - } + private final StringBuilder buffer = new StringBuilder(2048); + private String messagePattern; + private int argCount; + private transient Object[] varargs; + private transient Object[] params = new Object[10]; + private transient Throwable throwable; - private void init(String messagePattern, int argCount, Object[] paramArray) { - this.varargs = null; - this.buffer.setLength(0); + /** + * Creates a reusable message. + */ + public ReusableParameterizedMessage() { + } - this.messagePattern = messagePattern; - this.argCount= argCount; - //this.formattedMessage = null; - int usedCount = ParameterFormatter.countArgumentPlaceholders(messagePattern); - initThrowable(paramArray, usedCount); - } + private Object[] getTrimmedParams() { + return varargs == null ? Arrays.copyOf(params, argCount) : varargs; + } - private void initThrowable(final Object[] params, final int usedParams) { - if (usedParams < argCount && this.throwable == null && params[argCount - 1] instanceof Throwable) { - this.throwable = (Throwable) params[argCount - 1]; - argCount--; - } - } + private Object[] getParams() { + return varargs == null ? params : varargs; } - // storing non-JDK classes in ThreadLocals causes memory leaks in web apps, do not use in web apps! - private static ThreadLocal<InternalState> state = new ThreadLocal<>(); + private void init(String messagePattern, int argCount, Object[] paramArray) { + this.varargs = null; + this.buffer.setLength(0); - /** - * Creates a reusable message. - */ - public ReusableParameterizedMessage() { + this.messagePattern = messagePattern; + this.argCount= argCount; + int usedCount = ParameterFormatter.countArgumentPlaceholders(messagePattern); + initThrowable(paramArray, usedCount); } - private InternalState getState() { - InternalState result = state.get(); - if (result == null) { - result = new InternalState(); - state.set(result); + private void initThrowable(final Object[] params, final int usedParams) { + if (usedParams < argCount && this.throwable == null && params[argCount - 1] instanceof Throwable) { + this.throwable = (Throwable) params[argCount - 1]; + argCount--; } - return result; } public StringBuilder get() { - return getState().buffer; + return buffer; } ReusableParameterizedMessage set(String messagePattern, Object... arguments) { - InternalState state = getState(); - state.init(messagePattern, arguments == null ? 0 : arguments.length, arguments); - state.varargs = arguments; + init(messagePattern, arguments == null ? 0 : arguments.length, arguments); + varargs = arguments; return this; } ReusableParameterizedMessage set(String messagePattern, Object p0) { - InternalState state = getState(); - state.params[0] = p0; - state.init(messagePattern, 1, state.params); + params[0] = p0; + init(messagePattern, 1, params); return this; } ReusableParameterizedMessage set(String messagePattern, Object p0, Object p1) { - InternalState state = getState(); - state.params[0] = p0; - state.params[1] = p1; - state.init(messagePattern, 2, state.params); + params[0] = p0; + params[1] = p1; + init(messagePattern, 2, params); return this; } ReusableParameterizedMessage set(String messagePattern, Object p0, Object p1, Object p2) { - InternalState state = getState(); - state.params[0] = p0; - state.params[1] = p1; - state.params[2] = p2; - state.init(messagePattern, 3, state.params); + params[0] = p0; + params[1] = p1; + params[2] = p2; + init(messagePattern, 3, params); return this; } ReusableParameterizedMessage set(String messagePattern, Object p0, Object p1, Object p2, Object p3) { - InternalState state = getState(); - state.params[0] = p0; - state.params[1] = p1; - state.params[2] = p2; - state.params[3] = p3; - state.init(messagePattern, 4, state.params); + params[0] = p0; + params[1] = p1; + params[2] = p2; + params[3] = p3; + init(messagePattern, 4, params); return this; } ReusableParameterizedMessage set(String messagePattern, Object p0, Object p1, Object p2, Object p3, Object p4) { - InternalState state = getState(); - state.params[0] = p0; - state.params[1] = p1; - state.params[2] = p2; - state.params[3] = p3; - state.params[4] = p4; - state.init(messagePattern, 5, state.params); + params[0] = p0; + params[1] = p1; + params[2] = p2; + params[3] = p3; + params[4] = p4; + init(messagePattern, 5, params); return this; } ReusableParameterizedMessage set(String messagePattern, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5) { - InternalState state = getState(); - state.params[0] = p0; - state.params[1] = p1; - state.params[2] = p2; - state.params[3] = p3; - state.params[4] = p4; - state.params[5] = p5; - state.init(messagePattern, 6, state.params); + params[0] = p0; + params[1] = p1; + params[2] = p2; + params[3] = p3; + params[4] = p4; + params[5] = p5; + init(messagePattern, 6, params); return this; } ReusableParameterizedMessage set(String messagePattern, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, Object p6) { - InternalState state = getState(); - state.params[0] = p0; - state.params[1] = p1; - state.params[2] = p2; - state.params[3] = p3; - state.params[4] = p4; - state.params[5] = p5; - state.params[6] = p6; - state.init(messagePattern, 7, state.params); + params[0] = p0; + params[1] = p1; + params[2] = p2; + params[3] = p3; + params[4] = p4; + params[5] = p5; + params[6] = p6; + init(messagePattern, 7, params); return this; } ReusableParameterizedMessage set(String messagePattern, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, Object p6, Object p7) { - InternalState state = getState(); - state.params[0] = p0; - state.params[1] = p1; - state.params[2] = p2; - state.params[3] = p3; - state.params[4] = p4; - state.params[5] = p5; - state.params[6] = p6; - state.params[7] = p7; - state.init(messagePattern, 8, state.params); + params[0] = p0; + params[1] = p1; + params[2] = p2; + params[3] = p3; + params[4] = p4; + params[5] = p5; + params[6] = p6; + params[7] = p7; + init(messagePattern, 8, params); return this; } ReusableParameterizedMessage set(String messagePattern, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, Object p6, Object p7, Object p8) { - InternalState state = getState(); - state.params[0] = p0; - state.params[1] = p1; - state.params[2] = p2; - state.params[3] = p3; - state.params[4] = p4; - state.params[5] = p5; - state.params[6] = p6; - state.params[7] = p7; - state.params[8] = p8; - state.init(messagePattern, 9, state.params); + params[0] = p0; + params[1] = p1; + params[2] = p2; + params[3] = p3; + params[4] = p4; + params[5] = p5; + params[6] = p6; + params[7] = p7; + params[8] = p8; + init(messagePattern, 9, params); return this; } ReusableParameterizedMessage set(String messagePattern, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, Object p6, Object p7, Object p8, Object p9) { - InternalState state = getState(); - state.params[0] = p0; - state.params[1] = p1; - state.params[2] = p2; - state.params[3] = p3; - state.params[4] = p4; - state.params[5] = p5; - state.params[6] = p6; - state.params[7] = p7; - state.params[8] = p8; - state.params[9] = p9; - state.init(messagePattern, 10, state.params); + params[0] = p0; + params[1] = p1; + params[2] = p2; + params[3] = p3; + params[4] = p4; + params[5] = p5; + params[6] = p6; + params[7] = p7; + params[8] = p8; + params[9] = p9; + init(messagePattern, 10, params); return this; } @@ -219,7 +195,7 @@ public class ReusableParameterizedMessage implements ReusableMessage { */ @Override public String getFormat() { - return getState().messagePattern; + return messagePattern; } /** @@ -228,7 +204,7 @@ public class ReusableParameterizedMessage implements ReusableMessage { */ @Override public Object[] getParameters() { - return getState().getTrimmedParams(); + return getTrimmedParams(); } /** @@ -242,7 +218,7 @@ public class ReusableParameterizedMessage implements ReusableMessage { */ @Override public Throwable getThrowable() { - return getState().throwable; + return throwable; } /** @@ -251,16 +227,13 @@ public class ReusableParameterizedMessage implements ReusableMessage { */ @Override public String getFormattedMessage() { - final InternalState state = getState(); - final StringBuilder buffer = state.buffer; formatTo(buffer); return buffer.toString(); } @Override public void formatTo(final StringBuilder buffer) { - InternalState state = getState(); - ParameterFormatter.formatMessage(buffer, state.messagePattern, state.getParams(), state.argCount); + ParameterFormatter.formatMessage(buffer, messagePattern, getParams(), argCount); }
