java.lang.Object | |
↳ | org.springframework.jms.listener.adapter.MessageListenerAdapter |
Known Direct Subclasses |
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 JMS API.
By default, the content of incoming JMS 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
JMS 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 JMS Message
and sent to the response destination
(either the JMS "reply-to" destination or a
#setDefaultResponseDestination(javax.jms.Destination) specified default
destination).
Note: The sending of response messages is only available when
using the SessionAwareMessageListener
entry point (typically through a
Spring message listener container). Usage as standard JMS 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 handles all
Message
types 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(TextMessage message); void handleMessage(MapMessage message); void handleMessage(BytesMessage message); void handleMessage(ObjectMessage message); }This next example illustrates a
Message
delegate
that just consumes the String
contents of
javax.jms.TextMessage TextMessages. 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
javax.jms.TextMessage TextMessages. Notice how the return type
of this method is String
: This will result in the configured
MessageListenerAdapter
sending a javax.jms.TextMessage 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 it's attendant XML configuration) in detail.
Constants | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
String | ORIGINAL_DEFAULT_LISTENER_METHOD | Out-of-the-box value for the default listener method: "handleMessage". |
Fields | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
logger | Logger available to subclasses |
Public Constructors | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Create a new
MessageListenerAdapter with default settings. | |||||||||||
Create a new
MessageListenerAdapter for the given delegate. |
Public Methods | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Determine the subscription name for this message listener object.
| |||||||||||
Spring
SessionAwareMessageListener entry point. | |||||||||||
Standard JMS MessageListener entry point.
| |||||||||||
Specify the name of the default listener method to delegate to,
for the case where no specific listener method has been determined.
| |||||||||||
Set the default destination to send response messages to.
| |||||||||||
Set the name of the default response queue to send response messages to.
| |||||||||||
Set the name of the default response topic to send response messages to.
| |||||||||||
Set a target object to delegate message listening to.
| |||||||||||
Set the DestinationResolver that should be used to resolve response
destination names for this adapter.
| |||||||||||
Set the converter that will convert incoming JMS messages to
listener method arguments, and objects returned from listener
methods back to JMS messages.
|
Protected Methods | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Build an array of arguments to be passed into the target listener method.
| |||||||||||
Build a JMS message to be sent as response based on the given result object.
| |||||||||||
Extract the message body from the given JMS message.
| |||||||||||
Return the name of the default listener method to delegate to.
| |||||||||||
Return the target object to delegate message listening to.
| |||||||||||
Return the DestinationResolver for this adapter.
| |||||||||||
Determine the name of the listener method that is supposed to
handle the given message.
| |||||||||||
Return the converter that will convert incoming JMS messages to
listener method arguments, and objects returned from listener
methods back to JMS messages.
| |||||||||||
Determine a response destination for the given message.
| |||||||||||
Handle the given exception that arose during listener execution.
| |||||||||||
Handle the given result object returned from the listener method,
sending a response message back.
| |||||||||||
Initialize the default implementations for the adapter's strategies.
| |||||||||||
Invoke the specified listener method.
| |||||||||||
Post-process the given message producer before using it to send the response.
| |||||||||||
Post-process the given response message before it will be sent.
| |||||||||||
Resolve the default response destination into a JMS Destination, using this
accessor's
DestinationResolver in case of a destination name. | |||||||||||
Send the given response message to the given destination.
|
[Expand]
Inherited Methods | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
From class
java.lang.Object
| |||||||||||
From interface
org.springframework.jms.listener.SessionAwareMessageListener
| |||||||||||
From interface
org.springframework.jms.listener.SubscriptionNameProvider
|
Out-of-the-box value for the default listener method: "handleMessage".
Logger available to subclasses
Create a new MessageListenerAdapter
for the given delegate.
delegate | the delegate object |
---|
Determine the subscription name for this message listener object.
Spring SessionAwareMessageListener
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 JMS message and send it back.
message | the incoming JMS message |
---|---|
session | the JMS session to operate on |
if thrown by JMS API methods | |
JMSException |
Standard JMS MessageListener entry point.
Delegates the message to the target listener method, with appropriate
conversion of the message argument. In case of an exception, the
handleListenerException(Throwable)
method will be invoked.
Note: Does not support sending response messages based on
result objects returned from listener methods. Use the
SessionAwareMessageListener
entry point (typically through a Spring
message listener container) for handling result objects as well.
message | the incoming JMS message |
---|
handleListenerException(Throwable)
Specify the name of the default listener method to delegate to,
for the case where no specific listener method has been determined.
Out-of-the-box value is "handleMessage"
.
Set the default destination to send response messages to. This will be applied in case of a request message that does not carry a "JMSReplyTo" field.
Response destinations are only relevant for listener methods that return result objects, which will be wrapped in a response message and sent to a response destination.
Alternatively, specify a "defaultResponseQueueName" or "defaultResponseTopicName", to be dynamically resolved via the DestinationResolver.
Set the name of the default response queue to send response messages to. This will be applied in case of a request message that does not carry a "JMSReplyTo" field.
Alternatively, specify a JMS Destination object as "defaultResponseDestination".
setDestinationResolver(DestinationResolver)
Set the name of the default response topic to send response messages to. This will be applied in case of a request message that does not carry a "JMSReplyTo" field.
Alternatively, specify a JMS Destination object as "defaultResponseDestination".
setDestinationResolver(DestinationResolver)
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.
Set the DestinationResolver that should be used to resolve response destination names for this adapter.
The default resolver is a DynamicDestinationResolver. Specify a JndiDestinationResolver for resolving destination names as JNDI locations.
Set the converter that will convert incoming JMS messages to listener method arguments, and objects returned from listener methods back to JMS messages.
The default converter is a SimpleMessageConverter
, which is able
to handle javax.jms.BytesMessage BytesMessages,
javax.jms.TextMessage TextMessages and
javax.jms.ObjectMessage ObjectMessages.
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.
extractedMessage | the content of the message |
---|
Build a JMS message to be sent as response based on the given result object.
session | the JMS Session to operate on |
---|---|
result | the content of the message, as returned from the listener method |
Message
(never null
)if thrown by JMS API methods | |
JMSException |
Extract the message body from the given JMS message.
message | the JMS Message |
---|
if thrown by JMS API methods | |
JMSException |
Return the name of the default listener method to delegate to.
Return the DestinationResolver for this adapter.
Determine the name of the listener method that is supposed to handle the given message.
The default implementation simply returns the configured default listener method, if any.
originalMessage | the JMS request message |
---|---|
extractedMessage | the converted JMS request message, to be passed into the listener method as argument |
null
)if thrown by JMS API methods | |
JMSException |
Return the converter that will convert incoming JMS messages to listener method arguments, and objects returned from listener methods back to JMS messages.
Determine a response destination for the given message.
The default implementation first checks the JMS Reply-To
Destination of the supplied request; if that is not null
it is returned; if it is null
, then the configured
default response destination
is returned; if this too is null
, then an
InvalidDestinationException is thrown.
request | the original incoming JMS message |
---|---|
response | the outgoing JMS message about to be sent |
session | the JMS Session to operate on |
null
)if thrown by JMS API methods | |
if no Destination can be determined | |
JMSException |
setDefaultResponseDestination(Destination)
Handle the given exception that arose during listener execution. The default implementation logs the exception at error level.
This method only applies when used as standard JMS MessageListener.
In case of the Spring SessionAwareMessageListener
mechanism,
exceptions get handled by the caller instead.
ex | the exception to handle |
---|
Handle the given result object returned from the listener method, sending a response message back.
result | the result object to handle (never null ) |
---|---|
request | the original request message |
session | the JMS Session to operate on (may be null ) |
if thrown by JMS API methods | |
JMSException |
Initialize the default implementations for the adapter's strategies.
Invoke the specified listener method.
methodName | the name of the listener method |
---|---|
arguments | the message arguments to be passed in |
if thrown by JMS API methods | |
JMSException |
Post-process the given message producer before using it to send the response.
The default implementation is empty.
producer | the JMS message producer that will be used to send the message |
---|---|
response | the outgoing JMS message about to be sent |
if thrown by JMS API methods | |
JMSException |
Post-process the given response message before it will be sent.
The default implementation sets the response's correlation id to the request message's correlation id, if any; otherwise to the request message id.
request | the original incoming JMS message |
---|---|
response | the outgoing JMS message about to be sent |
if thrown by JMS API methods | |
JMSException |
Resolve the default response destination into a JMS Destination, using this
accessor's DestinationResolver
in case of a destination name.
if resolution failed | |
JMSException |
Send the given response message to the given destination.
session | the JMS session to operate on |
---|---|
destination | the JMS destination to send to |
response | the JMS message to send |
if thrown by JMS API methods | |
JMSException |
postProcessProducer(MessageProducer, Message)