[GitHub] activemq-artemis pull request #2427: ARTEMIS-2170 Optimized CoreMessage's ch...

classic Classic list List threaded Threaded
58 messages Options
123
Reply | Threaded
Open this post in threaded view
|

[GitHub] activemq-artemis pull request #2427: ARTEMIS-2170 Optimized CoreMessage's ch...

rstancel
GitHub user franz1981 opened a pull request:

    https://github.com/apache/activemq-artemis/pull/2427

    ARTEMIS-2170 Optimized CoreMessage's checkProperties and cleanupInternalProperties methods

    It includes 2 optimizations related to CoreMessage hot paths operations: checkProperties and cleanupInternalProperties.


You can merge this pull request into a Git repository by running:

    $ git pull https://github.com/franz1981/activemq-artemis ARTEMIS-2170

Alternatively you can review and apply these changes as the patch at:

    https://github.com/apache/activemq-artemis/pull/2427.patch

To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:

    This closes #2427
   
----
commit f4f1e125603f6c510541395a102df68bb7dae66e
Author: Francesco Nigro <nigro.fra@...>
Date:   2018-11-11T09:44:29Z

    ARTEMIS-2170 Optimized CoreMessage's cleanupInternalProperties method
   
    The cleanup is now performed into TypedProperties both
    for performance reasons (avoilock/unlock many times)
    and consistency, given that the operation is now atomic.

commit 8b6e9a417c39ef6b043b7b11c504254e6721d10b
Author: Francesco Nigro <nigro.fra@...>
Date:   2018-11-11T10:32:49Z

    ARTEMIS-2170 Optimized CoreMessage's checkProperties method
   
    Any checkProperties();<usage of this.properties> pattern has been
    replaced by an atomic checkProperties().<usage of returned properties>
    to help both performance and consistency.

----


---
Reply | Threaded
Open this post in threaded view
|

[GitHub] activemq-artemis issue #2427: ARTEMIS-2170 Optimized CoreMessage's checkProp...

rstancel
Github user franz1981 commented on the issue:

    https://github.com/apache/activemq-artemis/pull/2427
 
    I need to run a full CI on this one: in the meantime please take time to review it, given that is changing parts that have been recently cause of several concurrency bugs.
    My change shouldn't introduce any semantic changes, but is addressing the concurrent changes on TypedProperties in a more optimized and consistent manner :+1:


---
Reply | Threaded
Open this post in threaded view
|

[GitHub] activemq-artemis issue #2427: ARTEMIS-2170 Optimized CoreMessage's checkProp...

rstancel
In reply to this post by rstancel
Github user michaelandrepearce commented on the issue:

    https://github.com/apache/activemq-artemis/pull/2427
 
    Overal looks good a few comments


---
Reply | Threaded
Open this post in threaded view
|

[GitHub] activemq-artemis pull request #2427: ARTEMIS-2170 Optimized CoreMessage's ch...

rstancel
In reply to this post by rstancel
Github user michaelandrepearce commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/2427#discussion_r232491023
 
    --- Diff: artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/CoreMessage.java ---
    @@ -803,52 +802,45 @@ public CoreMessage setDurable(boolean durable) {
        @Override
        public CoreMessage putBooleanProperty(final String key, final boolean value) {
           messageChanged();
    -      checkProperties();
    -      properties.putBooleanProperty(SimpleString.toSimpleString(key, getPropertyKeysPool()), value);
    +      checkProperties().putBooleanProperty(SimpleString.toSimpleString(key, getPropertyKeysPool()), value);
    --- End diff --
   
    Why not make this delegate to method that takes simple string


---
Reply | Threaded
Open this post in threaded view
|

[GitHub] activemq-artemis pull request #2427: ARTEMIS-2170 Optimized CoreMessage's ch...

rstancel
In reply to this post by rstancel
Github user michaelandrepearce commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/2427#discussion_r232490920
 
    --- Diff: artemis-commons/src/main/java/org/apache/activemq/artemis/utils/collections/TypedProperties.java ---
    @@ -318,6 +320,33 @@ public synchronized boolean containsProperty(final SimpleString key) {
           }
        }
     
    +   public synchronized boolean cleanupInternalProperties(Predicate<SimpleString> propertyNamePredicate) {
    +      if (!internalProperties) {
    --- End diff --
   
    -1 moving this to TypedProperties, as typedproperties is generic and used not just for message. It shouldnt have message particulars. Would you be against moving this back to coremessage? Or to messageutils


---
Reply | Threaded
Open this post in threaded view
|

[GitHub] activemq-artemis pull request #2427: ARTEMIS-2170 Optimized CoreMessage's ch...

rstancel
In reply to this post by rstancel
Github user michaelandrepearce commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/2427#discussion_r232491039
 
    --- Diff: artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/CoreMessage.java ---
    @@ -803,52 +802,45 @@ public CoreMessage setDurable(boolean durable) {
        @Override
        public CoreMessage putBooleanProperty(final String key, final boolean value) {
           messageChanged();
    -      checkProperties();
    -      properties.putBooleanProperty(SimpleString.toSimpleString(key, getPropertyKeysPool()), value);
    +      checkProperties().putBooleanProperty(SimpleString.toSimpleString(key, getPropertyKeysPool()), value);
           return this;
        }
     
        @Override
        public CoreMessage putBooleanProperty(final SimpleString key, final boolean value) {
           messageChanged();
    -      checkProperties();
    -      properties.putBooleanProperty(key, value);
    +      checkProperties().putBooleanProperty(key, value);
           return this;
        }
     
        @Override
        public Boolean getBooleanProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
    -      checkProperties();
    -      return properties.getBooleanProperty(key);
    +      return checkProperties().getBooleanProperty(key);
        }
     
        @Override
        public Boolean getBooleanProperty(final String key) throws ActiveMQPropertyConversionException {
    -      checkProperties();
    -      return properties.getBooleanProperty(SimpleString.toSimpleString(key, getPropertyKeysPool()));
    +      return checkProperties().getBooleanProperty(SimpleString.toSimpleString(key, getPropertyKeysPool()));
    --- End diff --
   
    Delegate to simplestring method


---
Reply | Threaded
Open this post in threaded view
|

[GitHub] activemq-artemis pull request #2427: ARTEMIS-2170 Optimized CoreMessage's ch...

rstancel
In reply to this post by rstancel
Github user michaelandrepearce commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/2427#discussion_r232491068
 
    --- Diff: artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/CoreMessage.java ---
    @@ -887,55 +876,48 @@ public CoreMessage putBytesProperty(final String key, final byte[] value) {
        @Override
        public CoreMessage putCharProperty(SimpleString key, char value) {
           messageChanged();
    -      checkProperties();
    -      properties.putCharProperty(key, value);
    +      checkProperties().putCharProperty(key, value);
           return this;
        }
     
        @Override
        public CoreMessage putCharProperty(String key, char value) {
           messageChanged();
    -      checkProperties();
    -      properties.putCharProperty(SimpleString.toSimpleString(key, getPropertyKeysPool()), value);
    +      checkProperties().putCharProperty(SimpleString.toSimpleString(key, getPropertyKeysPool()), value);
    --- End diff --
   
    Delegate to simplestring method variant. Ditto for all cases on this


---
Reply | Threaded
Open this post in threaded view
|

[GitHub] activemq-artemis pull request #2427: ARTEMIS-2170 Optimized CoreMessage's ch...

rstancel
In reply to this post by rstancel
Github user franz1981 commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/2427#discussion_r232498771
 
    --- Diff: artemis-commons/src/main/java/org/apache/activemq/artemis/utils/collections/TypedProperties.java ---
    @@ -318,6 +320,33 @@ public synchronized boolean containsProperty(final SimpleString key) {
           }
        }
     
    +   public synchronized boolean cleanupInternalProperties(Predicate<SimpleString> propertyNamePredicate) {
    +      if (!internalProperties) {
    --- End diff --
   
    The biggest improvement here is exactly due to the fact that cleaning up properties atomically is a duty of who own the data ie TypedProperties.
    About the message particulars I do believe that `TypedProperty` already contains some of them:
   
    - internal property name prefix ie `TypedProperties.AMQ_PROPNAME`
    - internal properties presence checks ie `TypedProperties::hasInternalProperties`
   
    I have used the `Predicate` to allow decoupling, but I understand your point here: we can move it outer (as it is, algoritmically), but I'm not fully sure that it will bring the same benefit (eg enter/exit synchronize TypedProperty once).
    Just to give some reason of this change: with this PR it is producing less then 1/4 of the garbage while having more then twice the throughput.


---
Reply | Threaded
Open this post in threaded view
|

[GitHub] activemq-artemis pull request #2427: ARTEMIS-2170 Optimized CoreMessage's ch...

rstancel
In reply to this post by rstancel
Github user michaelandrepearce commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/2427#discussion_r232558150
 
    --- Diff: artemis-commons/src/main/java/org/apache/activemq/artemis/utils/collections/TypedProperties.java ---
    @@ -318,6 +320,33 @@ public synchronized boolean containsProperty(final SimpleString key) {
           }
        }
     
    +   public synchronized boolean cleanupInternalProperties(Predicate<SimpleString> propertyNamePredicate) {
    +      if (!internalProperties) {
    --- End diff --
   
    It may have them from legacy someone put it there, but if you were designing a collections class, you'd design it in a fashion so it focussed just on the logic it needs to have so you ensure its good.
   
    If anything that field, the flag and the method check hasInternalProperties really should move upto CoreMessage, as its only used there.


---
Reply | Threaded
Open this post in threaded view
|

[GitHub] activemq-artemis pull request #2427: ARTEMIS-2170 Optimized CoreMessage's ch...

rstancel
In reply to this post by rstancel
Github user franz1981 commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/2427#discussion_r232560925
 
    --- Diff: artemis-commons/src/main/java/org/apache/activemq/artemis/utils/collections/TypedProperties.java ---
    @@ -318,6 +320,33 @@ public synchronized boolean containsProperty(final SimpleString key) {
           }
        }
     
    +   public synchronized boolean cleanupInternalProperties(Predicate<SimpleString> propertyNamePredicate) {
    +      if (!internalProperties) {
    --- End diff --
   
    I agree: in that case I would move the other `Message`ish things outside `TypedProperties`.
    I was hoping for a less impactfull change TBH, but you really got a point about this. Let me check if I can perform a surgical removal to make the code simpler and cleaner :+1:


---
Reply | Threaded
Open this post in threaded view
|

[GitHub] activemq-artemis pull request #2427: ARTEMIS-2170 Optimized CoreMessage's ch...

rstancel
In reply to this post by rstancel
Github user franz1981 commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/2427#discussion_r232590511
 
    --- Diff: artemis-commons/src/main/java/org/apache/activemq/artemis/utils/collections/TypedProperties.java ---
    @@ -318,6 +320,33 @@ public synchronized boolean containsProperty(final SimpleString key) {
           }
        }
     
    +   public synchronized boolean cleanupInternalProperties(Predicate<SimpleString> propertyNamePredicate) {
    +      if (!internalProperties) {
    --- End diff --
   
    @michaelandrepearce I'm working on `CoreMessage` to inject into it both `internalProperties` and the cleanupLogic, but TBH the concurrent behaviour is not trivial: it has to be consistent with `TypedProperties` content assuming that the volatile reference of it into `CoreMessage` could change: I'm not sure it would be that easy to change it


---
Reply | Threaded
Open this post in threaded view
|

[GitHub] activemq-artemis pull request #2427: ARTEMIS-2170 Optimized CoreMessage's ch...

rstancel
In reply to this post by rstancel
Github user michaelandrepearce commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/2427#discussion_r232654687
 
    --- Diff: artemis-commons/src/main/java/org/apache/activemq/artemis/utils/collections/TypedProperties.java ---
    @@ -318,6 +320,33 @@ public synchronized boolean containsProperty(final SimpleString key) {
           }
        }
     
    +   public synchronized boolean cleanupInternalProperties(Predicate<SimpleString> propertyNamePredicate) {
    +      if (!internalProperties) {
    --- End diff --
   
    Whats your branch? Ill have a better look later tonight or tomorrow and send you some ideas if you want.


---
Reply | Threaded
Open this post in threaded view
|

[GitHub] activemq-artemis pull request #2427: ARTEMIS-2170 Optimized CoreMessage's ch...

rstancel
In reply to this post by rstancel
Github user franz1981 commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/2427#discussion_r232758121
 
    --- Diff: artemis-commons/src/main/java/org/apache/activemq/artemis/utils/collections/TypedProperties.java ---
    @@ -318,6 +320,33 @@ public synchronized boolean containsProperty(final SimpleString key) {
           }
        }
     
    +   public synchronized boolean cleanupInternalProperties(Predicate<SimpleString> propertyNamePredicate) {
    +      if (!internalProperties) {
    --- End diff --
   
    I have pushed a new version of the change that's using a private subclass of 'TypedProperties' where needed to allow atomic updates of the `internalProperties` flag: I'm not very about about the factory method on 'CoreMessage' to allow the client messages to not use that subclass: this is an additional optimisation given that the original code where always using 'TypedProperties' that where chacking on each added property if it was an 'internal" one.


---
Reply | Threaded
Open this post in threaded view
|

[GitHub] activemq-artemis pull request #2427: ARTEMIS-2170 Optimized CoreMessage's ch...

rstancel
In reply to this post by rstancel
Github user michaelandrepearce commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/2427#discussion_r233197168
 
    --- Diff: artemis-commons/src/main/java/org/apache/activemq/artemis/utils/collections/TypedProperties.java ---
    @@ -318,6 +313,46 @@ public synchronized boolean containsProperty(final SimpleString key) {
           }
        }
     
    +   public synchronized boolean anyPropertyNameMatch(Predicate<SimpleString> propertyNamePredicate) {
    --- End diff --
   
    this would be a contains method


---
Reply | Threaded
Open this post in threaded view
|

[GitHub] activemq-artemis pull request #2427: ARTEMIS-2170 Optimized CoreMessage's ch...

rstancel
In reply to this post by rstancel
Github user michaelandrepearce commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/2427#discussion_r233197359
 
    --- Diff: artemis-commons/src/main/java/org/apache/activemq/artemis/utils/collections/TypedProperties.java ---
    @@ -318,6 +313,46 @@ public synchronized boolean containsProperty(final SimpleString key) {
           }
        }
     
    +   public synchronized boolean anyPropertyNameMatch(Predicate<SimpleString> propertyNamePredicate) {
    +      Objects.requireNonNull(propertyNamePredicate, "propertyNamePredicate cannot be null");
    +      if (properties == null) {
    +         return false;
    +      }
    +      if (properties.isEmpty()) {
    +         return false;
    +      }
    +      for (SimpleString propertyName : properties.keySet()) {
    +         if (propertyNamePredicate.test(propertyName)) {
    +            return true;
    +         }
    +      }
    +      return false;
    +   }
    +
    +   public synchronized boolean removeIfPropertyNameMatch(Predicate<SimpleString> propertyNamePredicate) {
    --- End diff --
   
    this is just a remove method , the args give the context that it removes only if predicate would match


---
Reply | Threaded
Open this post in threaded view
|

[GitHub] activemq-artemis pull request #2427: ARTEMIS-2170 Optimized CoreMessage's ch...

rstancel
In reply to this post by rstancel
Github user franz1981 commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/2427#discussion_r233205369
 
    --- Diff: artemis-commons/src/main/java/org/apache/activemq/artemis/utils/collections/TypedProperties.java ---
    @@ -318,6 +320,33 @@ public synchronized boolean containsProperty(final SimpleString key) {
           }
        }
     
    +   public synchronized boolean cleanupInternalProperties(Predicate<SimpleString> propertyNamePredicate) {
    +      if (!internalProperties) {
    --- End diff --
   
    I have added a super tiny optimization on `PacketImpl` turning a method into a static one: using https://github.com/AdoptOpenJDK/jitwatch to read the compilation logs seems to help the inlining of the method (for free). I would prefer to maintain separated the optimizations, but a single PR for a single word change (not a bug fix) seems really too much for me...wdyt?


---
Reply | Threaded
Open this post in threaded view
|

[GitHub] activemq-artemis pull request #2427: ARTEMIS-2170 Optimized CoreMessage's ch...

rstancel
In reply to this post by rstancel
Github user michaelandrepearce commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/2427#discussion_r233490193
 
    --- Diff: artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/CoreMessage.java ---
    @@ -564,34 +604,59 @@ public CoreMessage setUserID(UUID userID) {
        /**
         * I am keeping this synchronized as the decode of the Properties is lazy
         */
    -   protected TypedProperties checkProperties() {
    +   protected final TypedProperties checkProperties() {
    --- End diff --
   
    could this be renamed getProperties as it seems much like a getter method.


---
Reply | Threaded
Open this post in threaded view
|

[GitHub] activemq-artemis pull request #2427: ARTEMIS-2170 Optimized CoreMessage's ch...

rstancel
In reply to this post by rstancel
Github user michaelandrepearce commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/2427#discussion_r233490350
 
    --- Diff: artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/CoreMessage.java ---
    @@ -52,6 +52,62 @@
      *  consumers */
     public class CoreMessage extends RefCountMessage implements ICoreMessage {
     
    +   private static final class CoreTypedProperties extends TypedProperties {
    --- End diff --
   
    is this really needed, the way i see it, looking through the usage, these internal properties, are a bit like the extra properties that exist and introduced on AMQPMessage, e.g. theyre bits added onto the message but not part of the core message, could there just be two fields of type TypeProperties in core message, one (existing) for normal properties, and another for Internal Properties, which are these things, that then would make cleaning up / not forwarding on far easier, as then simply you clear them.


---
Reply | Threaded
Open this post in threaded view
|

[GitHub] activemq-artemis pull request #2427: ARTEMIS-2170 Optimized CoreMessage's ch...

rstancel
In reply to this post by rstancel
Github user michaelandrepearce commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/2427#discussion_r233491147
 
    --- Diff: artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/CoreMessage.java ---
    @@ -946,119 +994,103 @@ public Integer getIntProperty(final String key) throws ActiveMQPropertyConversio
        @Override
        public CoreMessage putLongProperty(final SimpleString key, final long value) {
           messageChanged();
    -      checkProperties();
    -      properties.putLongProperty(key, value);
    +      checkProperties().putLongProperty(key, value);
           return this;
        }
     
        @Override
        public CoreMessage putLongProperty(final String key, final long value) {
           messageChanged();
    -      checkProperties();
    -      properties.putLongProperty(SimpleString.toSimpleString(key, getPropertyKeysPool()), value);
    +      checkProperties().putLongProperty(SimpleString.toSimpleString(key, getPropertyKeysPool()), value);
           return this;
        }
     
        @Override
        public Long getLongProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
    -      checkProperties();
    -      return properties.getLongProperty(key);
    +      return checkProperties().getLongProperty(key);
        }
     
        @Override
        public Long getLongProperty(final String key) throws ActiveMQPropertyConversionException {
    -      checkProperties();
           return getLongProperty(SimpleString.toSimpleString(key));
        }
     
        @Override
        public CoreMessage putFloatProperty(final SimpleString key, final float value) {
           messageChanged();
    -      checkProperties();
    -      properties.putFloatProperty(key, value);
    +      checkProperties().putFloatProperty(key, value);
           return this;
        }
     
        @Override
        public CoreMessage putFloatProperty(final String key, final float value) {
           messageChanged();
    -      checkProperties();
    -      properties.putFloatProperty(SimpleString.toSimpleString(key, getPropertyKeysPool()), value);
    +      checkProperties().putFloatProperty(SimpleString.toSimpleString(key, getPropertyKeysPool()), value);
           return this;
        }
     
        @Override
        public CoreMessage putDoubleProperty(final SimpleString key, final double value) {
           messageChanged();
    -      checkProperties();
    -      properties.putDoubleProperty(key, value);
    +      checkProperties().putDoubleProperty(key, value);
           return this;
        }
     
        @Override
        public CoreMessage putDoubleProperty(final String key, final double value) {
           messageChanged();
    -      checkProperties();
    -      properties.putDoubleProperty(SimpleString.toSimpleString(key, getPropertyKeysPool()), value);
    +      checkProperties().putDoubleProperty(SimpleString.toSimpleString(key, getPropertyKeysPool()), value);
           return this;
        }
     
        @Override
        public Double getDoubleProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
    -      checkProperties();
    -      return properties.getDoubleProperty(key);
    +      return checkProperties().getDoubleProperty(key);
        }
     
        @Override
        public Double getDoubleProperty(final String key) throws ActiveMQPropertyConversionException {
    -      checkProperties();
           return getDoubleProperty(SimpleString.toSimpleString(key));
        }
     
        @Override
        public CoreMessage putStringProperty(final SimpleString key, final SimpleString value) {
           messageChanged();
    -      checkProperties();
    -      properties.putSimpleStringProperty(key, value);
    +      checkProperties().putSimpleStringProperty(key, value);
           return this;
        }
     
        @Override
        public CoreMessage putStringProperty(final SimpleString key, final String value) {
           messageChanged();
    -      checkProperties();
    -      properties.putSimpleStringProperty(key, SimpleString.toSimpleString(value, getPropertyValuesPool()));
    +      checkProperties().putSimpleStringProperty(key, SimpleString.toSimpleString(value, getPropertyValuesPool()));
           return this;
        }
     
     
        @Override
        public CoreMessage putStringProperty(final String key, final String value) {
           messageChanged();
    -      checkProperties();
    -      properties.putSimpleStringProperty(SimpleString.toSimpleString(key, getPropertyKeysPool()), SimpleString.toSimpleString(value, getPropertyValuesPool()));
    +      checkProperties().putSimpleStringProperty(SimpleString.toSimpleString(key, getPropertyKeysPool()), SimpleString.toSimpleString(value, getPropertyValuesPool()));
    --- End diff --
   
    delegate to    
    public CoreMessage putStringProperty(final SimpleString key, final String value) {



---
Reply | Threaded
Open this post in threaded view
|

[GitHub] activemq-artemis pull request #2427: ARTEMIS-2170 Optimized CoreMessage's ch...

rstancel
In reply to this post by rstancel
Github user michaelandrepearce commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/2427#discussion_r233491363
 
    --- Diff: artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/CoreMessage.java ---
    @@ -1070,26 +1102,22 @@ public CoreMessage putObjectProperty(final String key, final Object value) throw
     
        @Override
        public Short getShortProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
    -      checkProperties();
    -      return properties.getShortProperty(key);
    +      return checkProperties().getShortProperty(key);
        }
     
        @Override
        public Short getShortProperty(final String key) throws ActiveMQPropertyConversionException {
    -      checkProperties();
    -      return properties.getShortProperty(SimpleString.toSimpleString(key, getPropertyKeysPool()));
    +      return checkProperties().getShortProperty(SimpleString.toSimpleString(key, getPropertyKeysPool()));
    --- End diff --
   
    delegate to
       public Short getShortProperty(final SimpleString key) throws ActiveMQPropertyConversionException {



---
123