[ https://issues.apache.org/jira/browse/LOG4J2-1629?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17477475#comment-17477475 ]
Matt Sicker commented on LOG4J2-1629: ------------------------------------- This can be more easily supported with the Java 8 baseline in 2.x. This may also be relevant for LOG4J2-3344 to support it in garbage-free mode. > Support for primitive values in StringMap > ----------------------------------------- > > Key: LOG4J2-1629 > URL: https://issues.apache.org/jira/browse/LOG4J2-1629 > Project: Log4j 2 > Issue Type: Improvement > Components: API > Affects Versions: 2.7 > Reporter: Remko Popma > Assignee: Remko Popma > Priority: Major > > For some applications like financial trading systems, highly interactive > games or numerical computation-heavy scientific applications, a large portion > of data is stored in primitives. Applications like this sometimes need to set > such values in the logging context (e.g., order ID, algo strategy instance > ID, etc) and would prefer to avoid the overhead of boxing/unboxing these > primitives. > Building on top of the work done for LOG4J2-1447 and LOG4J2-1349, this ticket > proposes to add interfaces extending ThreadContextMap2, StringMap and > ReadOnlyStringMap to add support for primitive values: > {code} > public interface HybridThreadContextMap extends ThreadContextMap2 { > long getLong(String key); > void putLong(String key, long value); > boolean containsLong(String key); > HybridStringMap getHybridStringMap(); > /** The value that {@link #getLong()} should return if the map > * doesn't have a long value for the specified key. > */ > long getDefaultLong(); > void setDefaultLong(long defaultValue); > } > {code} > {code} > public interface ReadOnlyHybridStringMap extends ReadOnlyStringMap { > long getLong(String key); > boolean containsLong(String key); > long getDefaultLong(); > void setDefaultLong(long defaultValue); > void forEachLong(StringLongConsumer action); > void forEachLong(StringLongObjConsumer action); > } > {code} > {code} > public interface HybridStringMap extends StringMap, ReadOnlyHybridStringMap { > void putLong(String key, long value); > } > {code} > The semantics remain the same as a normal map: there is at most one value for > a key. Putting a value with the same key replaces the old value with that > key, regardless of whether the old value was an Object or a primitive. > An API supporting only primitive long values is sufficient because all > primitives can be represented as a 64 bit long. For example, a double can be > converted to a long and back with the {{Double.doubleToLongBits(double)}} > method and its reverse. Applications can decorate the Log4j interfaces with > custom facades that provide separate methods for different primitive types if > required. > For iteration, new interfaces StringLongConsumer and StringLongObjConsumer > are introduced. These interfaces are similar to the previous Consumer > interfaces except that their {{accept}} method takes a {{long}} parameter for > the value: > {code} > public interface StringLongConsumer { > /** > * Performs the operation given the specified arguments. > * @param key the first input argument > * @param longValue the second input argument as a primitive long, or > * a default value if the underlying value is not a > primitive value > */ > void accept(String key, long longValue); > } > public interface StringLongObjConsumer<T> { > void accept(String key, long value, T state); > } > {code} -- This message was sent by Atlassian Jira (v8.20.1#820001)