Uploaded image for project: 'ActiveMQ Artemis'
  1. ActiveMQ Artemis
  2. ARTEMIS-3623

extraProperties._AMQ_ACTUAL_EXPIRY should be numeric in expired AMQP messages

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Minor
    • Resolution: Fixed
    • 2.20.0
    • 2.19.1, 2.21.0
    • AMQP
    • None

    Description

      When an AMQP message is expired, it is moved to the ExpiryQueue. With this process, a few extra properties are added to describe the original/previous location of the message.

      However, property extraProperties._AMQ_ACTUAL_EXPIRY is added as a string value. This could have been an integer value to match the original data type.

      Since JS function formatTimestamp() is used to represent the value, the original string value is displayed again in parentheses.

      Solution is expected to be one of these 3:
      1) (preferred) _AMQ_ACTUAL_EXPIRY is made numeric. Function formatTimestamp() can do its work and a proper date-time will be shown.
      2) (alternative) _AMQ_ACTUAL_EXPIRY remains a string. Function formatTimestamp() should no longer be called.
      3) (alternative) _AMQ_ACTUAL_EXPIRY remains a string. Function formatTimestamp() is called with the parseInt() value of the string when the string consists only of digits.

      I'll create a PR for solution 1.

      Analysis notes:

      • (OK) example org.apache.activemq.artemis.jms.example.ExpiryExample uses getLongProperty("_AMQ_ACTUAL_EXPIRY"); and
      • (OK) org.apache.activemq.artemis.core.server.impl.QueueImpl uses copy.setBrokerProperty(Message.HDR_ACTUAL_EXPIRY_TIME, System.currentTimeMillis());; and
      • (OK) org.apache.activemq.artemis.core.server.transformer.ServerMessageImpl uses long actualExpiryTime = System.currentTimeMillis(); message.putLongProperty(Message.HDR_ACTUAL_EXPIRY_TIME, actualExpiryTime);; and
      • (OK) org.apache.activemq.artemis.tests.integration.client.ExpiryAddressTest uses Long actualExpiryTime = (Long) tm.getObjectProperty(Message.HDR_ACTUAL_EXPIRY_TIME);.
      • ...
      • (!!!) org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage.toPropertyMap() converts all extraProperties to strings (and truncate them when they are too long).

      Development notes:
      Add condition on value type. Numeric values are copied as-is. All other types keep their old behaviour.

      Test result:

      Attachments

        1. image-2021-12-30-10-40-10-032.png
          34 kB
          Erwin Dondorp
        2. screenshot-1.png
          35 kB
          Erwin Dondorp

        Issue Links

          Activity

            People

              Unassigned Unassigned
              erwindon Erwin Dondorp
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved:

                Time Tracking

                  Estimated:
                  Original Estimate - Not Specified
                  Not Specified
                  Remaining:
                  Remaining Estimate - 0h
                  0h
                  Logged:
                  Time Spent - 3.5h
                  3.5h