Class MessageListenerAdapter

  • All Implemented Interfaces:
    MessageListener, ChannelAwareMessageListener

    public class MessageListenerAdapter
    extends AbstractAdaptableMessageListener
    Message listener adapter that delegates the handling of messages to target listener methods via reflection, with flexible message type conversion. Allows listener methods to operate on message content types, completely independent from the Rabbit API.

    By default, the content of incoming Rabbit messages gets extracted before being passed into the target listener method, to let the target method operate on message content types such as String or byte array instead of the raw Message. Message type conversion is delegated to a Spring AMQ MessageConverter. By default, a SimpleMessageConverter will be used. (If you do not want such automatic message conversion taking place, then be sure to set the MessageConverter to null.)

    If a target listener method returns a non-null object (typically of a message content type such as String or byte array), it will get wrapped in a Rabbit Message and sent to the exchange of the incoming message with the routingKey that comes from the Rabbit ReplyTo property or via specified routingKey).

    Note: The sending of response messages is only available when using the ChannelAwareMessageListener entry point (typically through a Spring message listener container). Usage as MessageListener does not support the generation of response messages.

    Find below some examples of method signatures compliant with this adapter class. This first example handles all Message types and gets passed the contents of each Message type as an argument. No Message will be sent back as all of these methods return void.

     public interface MessageContentsDelegate {
            void handleMessage(String text);
    
            void handleMessage(Map map);
    
            void handleMessage(byte[] bytes);
    
            void handleMessage(Serializable obj);
     }
     
    This next example handle a Message type and gets passed the actual (raw) Message as an argument. Again, no Message will be sent back as all of these methods return void.
     public interface RawMessageDelegate {
            void handleMessage(Message message);
     }
     
    This next example illustrates a Message delegate that just consumes the String contents of Messages. Notice also how the name of the Message handling method is different from the original (this will have to be configured in the attandant bean definition). Again, no Message will be sent back as the method returns void.
     public interface TextMessageContentDelegate {
            void onMessage(String text);
     }
     
    This final example illustrates a Message delegate that just consumes the String contents of Messages. Notice how the return type of this method is String: This will result in the configured MessageListenerAdapter sending a Message in response.
     public interface ResponsiveTextMessageContentDelegate {
            String handleMessage(String text);
     }
     
    For further examples and discussion please do refer to the Spring reference documentation which describes this class (and its attendant XML configuration) in detail.
    Author:
    Juergen Hoeller, Mark Pollack, Mark Fisher, Dave Syer, Gary Russell, Greg Turnquist, Cai Kun
    See Also:
    setDelegate(java.lang.Object), setDefaultListenerMethod(java.lang.String), AbstractAdaptableMessageListener.setResponseRoutingKey(String), AbstractAdaptableMessageListener.setMessageConverter(org.springframework.amqp.support.converter.MessageConverter), SimpleMessageConverter, ChannelAwareMessageListener, AbstractMessageListenerContainer.setMessageListener(MessageListener)
    • Field Detail

      • ORIGINAL_DEFAULT_LISTENER_METHOD

        public static final String ORIGINAL_DEFAULT_LISTENER_METHOD
        Out-of-the-box value for the default listener method: "handleMessage".
        See Also:
        Constant Field Values
    • Constructor Detail

      • MessageListenerAdapter

        public MessageListenerAdapter()
        Create a new MessageListenerAdapter with default settings.
      • MessageListenerAdapter

        public MessageListenerAdapter​(Object delegate)
        Create a new MessageListenerAdapter for the given delegate.
        Parameters:
        delegate - the delegate object
      • MessageListenerAdapter

        public MessageListenerAdapter​(Object delegate,
                                      MessageConverter messageConverter)
        Create a new MessageListenerAdapter for the given delegate.
        Parameters:
        delegate - the delegate object
        messageConverter - the message converter to use
      • MessageListenerAdapter

        public MessageListenerAdapter​(Object delegate,
                                      String defaultListenerMethod)
        Create a new MessageListenerAdapter for the given delegate while also declaring its POJO method.
        Parameters:
        delegate - the delegate object
        defaultListenerMethod - name of the POJO method to call upon message receipt
    • Method Detail

      • setDelegate

        public void setDelegate​(Object delegate)
        Set a target object to delegate message listening to. Specified listener methods have to be present on this target object.

        If no explicit delegate object has been specified, listener methods are expected to present on this adapter instance, that is, on a custom subclass of this adapter, defining listener methods.

        Parameters:
        delegate - The delegate listener or POJO.
      • getDelegate

        protected Object getDelegate()
        Returns:
        The target object to delegate message listening to.
      • getDefaultListenerMethod

        protected String getDefaultListenerMethod()
        Returns:
        The name of the default listener method to delegate to.
      • setQueueOrTagToMethodName

        public void setQueueOrTagToMethodName​(Map<String,​String> queueOrTagToMethodName)
        Set the mapping of queue name or consumer tag to method name. The first lookup is by queue name, if that returns null, we lookup by consumer tag, if that returns null, the defaultListenerMethod is used.
        Parameters:
        queueOrTagToMethodName - the map.
        Since:
        1.5
      • addQueueOrTagToMethodName

        public void addQueueOrTagToMethodName​(String queueOrTag,
                                              String methodName)
        Add the mapping of a queue name or consumer tag to a method name. The first lookup is by queue name, if that returns null, we lookup by consumer tag, if that returns null, the defaultListenerMethod is used.
        Parameters:
        queueOrTag - The queue name or consumer tag.
        methodName - The method name.
        Since:
        1.5
      • removeQueueOrTagToMethodName

        public String removeQueueOrTagToMethodName​(String queueOrTag)
        Remove the mapping of a queue name or consumer tag to a method name.
        Parameters:
        queueOrTag - The queue name or consumer tag.
        Returns:
        the method name that was removed, or null.
        Since:
        1.5
      • onMessage

        public void onMessage​(Message message,
                              com.rabbitmq.client.Channel channel)
                       throws Exception
        Spring ChannelAwareMessageListener entry point.

        Delegates the message to the target listener method, with appropriate conversion of the message argument. If the target method returns a non-null object, wrap in a Rabbit message and send it back.

        Parameters:
        message - the incoming Rabbit message
        channel - the Rabbit channel to operate on
        Throws:
        Exception - if thrown by Rabbit API methods
      • buildListenerArguments

        protected Object[] buildListenerArguments​(Object extractedMessage,
                                                  com.rabbitmq.client.Channel channel,
                                                  Message message)
        Build an array of arguments to be passed into the target listener method. Allows for multiple method arguments to be built from a single message object.

        The default implementation builds an array with the given message object as sole element. This means that the extracted message will always be passed into a single method argument, even if it is an array, with the target method having a corresponding single argument of the array's type declared.

        This can be overridden to treat special message content such as arrays differently, for example passing in each element of the message array as distinct method argument.

        Parameters:
        extractedMessage - the content of the message
        channel - the Rabbit channel to operate on
        message - the incoming Rabbit message
        Returns:
        the array of arguments to be passed into the listener method (each element of the array corresponding to a distinct method argument)