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

Lost notification properties when using OpenWire client with a divert

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 2.11.0
    • 2.12.0
    • Broker, OpenWire
    • None

    Description

      As developer, I expect proper ActiveMQ Notifications, when consuming only some of them

      Steps to reproduce

      1a) Create a broker and add the following:

      <divert name="consumer-notification-divert">
              <address>activemq.notifications</address>
              <forwarding-address>jms.consumer.notifications</forwarding-address>
              <filter string="_AMQ_NotifType = 'CONSUMER_CREATED' OR _AMQ_NotifType = 'CONSUMER_CLOSED'"/>
      </divert>
      

      1b) Same situation for:

      <addresses xmlns="urn:activemq:core">
          <address name="activemq.notifications">
              <anycast>
                  <queue name="jms.consumer.notifications">
                      <durable>true</durable>
                      <filter string="_AMQ_NotifType = 'CONSUMER_CREATED' OR _AMQ_NotifType = 'CONSUMER_CLOSED'"/>
                  </queue>
              </anycast>
          </address>
      </addresses>
      

      2) Consume those messages with a MDB

      @MessageDriven(
              name = "Notification_Subber",
              activationConfig = {
                      @ActivationConfigProperty(propertyName = "destination", propertyValue = "jms.consumer.notifications"),
                      @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
                      @ActivationConfigProperty(propertyName = "useJndi", propertyValue = "false"),
              }
      )
      public class NotificationMDB implements MessageListener {
        public void onMessage(Message message) {
          // Log message here
          // The message is missing all properties as documented in https://activemq.apache.org/components/artemis/documentation/latest/management.html
        }
      }
      

      Expected Behavior

      I would expect the same messages that are consumed as follows:

      @MessageDriven(
              name = "Notification_Subber",
              activationConfig = {
                      @ActivationConfigProperty(propertyName = "destination", propertyValue = "activemq.notifications"),
                      @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
                      @ActivationConfigProperty(propertyName = "useJndi", propertyValue = "false"),
                      @ActivationConfigProperty(propertyName = "messageSelector",propertyValue = "_AMQ_NotifType = 'CONSUMER_CREATED' OR _AMQ_NotifType = 'CONSUMER_CLOSED'"
              }
      )
      public class NotificationMDB implements MessageListener {
        public void onMessage(Message message) {
          // Log message here
          // This one actually returns all properties 
        }
      }
      

      Current behavior

      I guess that the filter includes some kind of message-copy workflow which removes all those properties?
      During this copy process, all properties starting with "_" will be deleted.

      Workaround

      Right now, the only workaround for this issue is a custom transformer, which does the following:

      public class NotificationsTransformer implements Transformer {
          private static final Logger log = Logger.getLogger(NotificationsTransformer.class.getName());
          
          public Message transform(Message message) {
              try {
                  log.finest(String.format("Transform CoreMessage: %s", message.toString()));
      
                  message.putStringProperty("event_timestamp", message.getStringProperty("_AMQ_NotifTimestamp"));
                  message.putStringProperty("address_name", message.getStringProperty("_AMQ_Address"));
                  message.putStringProperty("event_type", message.getStringProperty("_AMQ_NotifType"));
                  message.putStringProperty("queue_name", message.getStringProperty("_AMQ_RoutingName"));
              } catch (Exception e) {
                  log.warning(String.format("Failed to transform message: %s", e.getMessage()));
              }
      
              return message;
          }
      }
      

      Steps to achieve victory

      Find the errorneous message copy
      Forward all message properties

      Attachments

        Issue Links

          Activity

            People

              Unassigned Unassigned
              ansgarS Ansgar J. Sachs
              Votes:
              0 Vote for this issue
              Watchers:
              3 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 - 20m
                  20m