Subpackage rearrangements within 4.1's jms-messaging alignment

Issue: SPR-10873
This commit is contained in:
Juergen Hoeller 2014-07-09 22:19:14 +02:00
parent 1fadd1c954
commit fa4f51c5d0
18 changed files with 165 additions and 214 deletions

View File

@ -48,7 +48,7 @@ import org.springframework.messaging.handler.annotation.MessageMapping;
* arguments including the support of validation</li> * arguments including the support of validation</li>
* <li>{@link org.springframework.messaging.handler.annotation.Header @Header}-annotated method * <li>{@link org.springframework.messaging.handler.annotation.Header @Header}-annotated method
* arguments to extract a specific header value, including standard JMS headers defined by * arguments to extract a specific header value, including standard JMS headers defined by
* {@link org.springframework.jms.support.converter.JmsHeaders JmsHeaders}</li> * {@link org.springframework.jms.support.JmsHeaders JmsHeaders}</li>
* <li>{@link org.springframework.messaging.handler.annotation.Headers @Headers}-annotated * <li>{@link org.springframework.messaging.handler.annotation.Headers @Headers}-annotated
* argument that must also be assignable to {@link java.util.Map} for getting access to all * argument that must also be assignable to {@link java.util.Map} for getting access to all
* headers.</li> * headers.</li>

View File

@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.jms.messaging; package org.springframework.jms.core;
import java.util.Map; import java.util.Map;

View File

@ -14,21 +14,17 @@
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.jms.messaging; package org.springframework.jms.core;
import java.util.Map; import java.util.Map;
import javax.jms.Destination; import javax.jms.Destination;
import javax.jms.JMSException; import javax.jms.JMSException;
import javax.jms.Session; import javax.jms.Session;
import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.InitializingBean;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.jms.support.converter.MessageConversionException; import org.springframework.jms.support.converter.MessageConversionException;
import org.springframework.jms.support.converter.MessageConverter; import org.springframework.jms.support.converter.MessageConverter;
import org.springframework.jms.support.converter.MessagingMessageConverter; import org.springframework.jms.support.converter.MessagingMessageConverter;
import org.springframework.jms.support.converter.SimpleJmsHeaderMapper;
import org.springframework.jms.support.converter.SimpleMessageConverter; import org.springframework.jms.support.converter.SimpleMessageConverter;
import org.springframework.messaging.Message; import org.springframework.messaging.Message;
import org.springframework.messaging.MessagingException; import org.springframework.messaging.MessagingException;
@ -42,17 +38,20 @@ import org.springframework.util.Assert;
* @author Stephane Nicoll * @author Stephane Nicoll
* @since 4.1 * @since 4.1
*/ */
public class JmsMessagingTemplate public class JmsMessagingTemplate extends AbstractMessageReceivingTemplate<Destination>
extends AbstractMessageReceivingTemplate<Destination>
implements JmsMessageOperations, InitializingBean { implements JmsMessageOperations, InitializingBean {
private JmsTemplate jmsTemplate; private JmsTemplate jmsTemplate;
private MessageConverter jmsMessageConverter = new MessagingMessageConverter( private MessageConverter jmsMessageConverter = new MessagingMessageConverter();
new SimpleMessageConverter(), new SimpleJmsHeaderMapper());
private String defaultDestinationName; private String defaultDestinationName;
/**
* Constructor for use with bean properties.
* Requires {@link #setJmsTemplate} to be called.
*/
public JmsMessagingTemplate() { public JmsMessagingTemplate() {
} }
@ -64,6 +63,7 @@ public class JmsMessagingTemplate
this.jmsTemplate = jmsTemplate; this.jmsTemplate = jmsTemplate;
} }
/** /**
* Set the {@link JmsTemplate} to use. * Set the {@link JmsTemplate} to use.
*/ */
@ -79,7 +79,6 @@ public class JmsMessagingTemplate
* <p>Consider configuring a {@link MessagingMessageConverter} with a different * <p>Consider configuring a {@link MessagingMessageConverter} with a different
* {@link MessagingMessageConverter#setPayloadConverter(MessageConverter) payload converter} * {@link MessagingMessageConverter#setPayloadConverter(MessageConverter) payload converter}
* for more advanced scenario. * for more advanced scenario.
*
* @see org.springframework.jms.support.converter.MessagingMessageConverter * @see org.springframework.jms.support.converter.MessagingMessageConverter
*/ */
public void setJmsMessageConverter(MessageConverter jmsMessageConverter) { public void setJmsMessageConverter(MessageConverter jmsMessageConverter) {
@ -150,18 +149,21 @@ public class JmsMessagingTemplate
@Override @Override
public void convertAndSend(String destinationName, Object payload, Map<String, Object> headers) public void convertAndSend(String destinationName, Object payload, Map<String, Object> headers)
throws MessagingException { throws MessagingException {
convertAndSend(destinationName, payload, headers, null); convertAndSend(destinationName, payload, headers, null);
} }
@Override @Override
public void convertAndSend(String destinationName, Object payload, MessagePostProcessor postProcessor) public void convertAndSend(String destinationName, Object payload, MessagePostProcessor postProcessor)
throws MessagingException { throws MessagingException {
convertAndSend(destinationName, payload, null, postProcessor); convertAndSend(destinationName, payload, null, postProcessor);
} }
@Override @Override
public void convertAndSend(String destinationName, Object payload, Map<String, Object> headers, public void convertAndSend(String destinationName, Object payload, Map<String, Object> headers,
MessagePostProcessor postProcessor) throws MessagingException { MessagePostProcessor postProcessor) throws MessagingException {
Message<?> message = doConvert(payload, headers, postProcessor); Message<?> message = doConvert(payload, headers, postProcessor);
send(destinationName, message); send(destinationName, message);
} }
@ -206,31 +208,29 @@ public class JmsMessagingTemplate
@Override @Override
protected void doSend(Destination destination, Message<?> message) { protected void doSend(Destination destination, Message<?> message) {
jmsTemplate.send(destination, new MessagingMessageCreator(message, this.jmsMessageConverter)); this.jmsTemplate.send(destination, new MessagingMessageCreator(message, this.jmsMessageConverter));
} }
protected void doSend(String destinationName, Message<?> message) { protected void doSend(String destinationName, Message<?> message) {
jmsTemplate.send(destinationName, new MessagingMessageCreator(message, this.jmsMessageConverter)); this.jmsTemplate.send(destinationName, new MessagingMessageCreator(message, this.jmsMessageConverter));
} }
@Override @Override
protected Message<?> doReceive(Destination destination) { protected Message<?> doReceive(Destination destination) {
javax.jms.Message jmsMessage = jmsTemplate.receive(destination); javax.jms.Message jmsMessage = this.jmsTemplate.receive(destination);
return doConvert(jmsMessage); return doConvert(jmsMessage);
} }
protected Message<?> doReceive(String destinationName) { protected Message<?> doReceive(String destinationName) {
javax.jms.Message jmsMessage = jmsTemplate.receive(destinationName); javax.jms.Message jmsMessage = this.jmsTemplate.receive(destinationName);
return doConvert(jmsMessage); return doConvert(jmsMessage);
} }
protected String getRequiredDefaultDestinationName() { protected String getRequiredDefaultDestinationName() {
String name = getDefaultDestinationName(); String name = getDefaultDestinationName();
if (name == null) { if (name == null) {
throw new IllegalStateException( throw new IllegalStateException("No 'defaultDestination' or 'defaultDestinationName' specified. " +
"No 'defaultDestination' or 'defaultDestinationName' specified. " + "Check configuration of JmsMessagingTemplate.");
"Check configuration of JmsMessagingTemplate."
);
} }
return name; return name;
} }
@ -240,10 +240,10 @@ public class JmsMessagingTemplate
return null; return null;
} }
try { try {
return (Message<?>) jmsMessageConverter.fromMessage(message); return (Message<?>) this.jmsMessageConverter.fromMessage(message);
} }
catch (JMSException e) { catch (JMSException ex) {
throw new MessageConversionException("Could not convert '" + message + "'", e); throw new MessageConversionException("Could not convert '" + message + "'", ex);
} }
} }
@ -254,14 +254,14 @@ public class JmsMessagingTemplate
private final MessageConverter messageConverter; private final MessageConverter messageConverter;
private MessagingMessageCreator(Message<?> message, MessageConverter messageConverter) { public MessagingMessageCreator(Message<?> message, MessageConverter messageConverter) {
this.message = message; this.message = message;
this.messageConverter = messageConverter; this.messageConverter = messageConverter;
} }
@Override @Override
public javax.jms.Message createMessage(Session session) throws JMSException { public javax.jms.Message createMessage(Session session) throws JMSException {
return messageConverter.toMessage(message, session); return this.messageConverter.toMessage(this.message, session);
} }
} }

View File

@ -28,12 +28,12 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.springframework.jms.listener.SessionAwareMessageListener; import org.springframework.jms.listener.SessionAwareMessageListener;
import org.springframework.jms.support.JmsHeaderMapper;
import org.springframework.jms.support.JmsUtils; import org.springframework.jms.support.JmsUtils;
import org.springframework.jms.support.converter.JmsHeaderMapper; import org.springframework.jms.support.SimpleJmsHeaderMapper;
import org.springframework.jms.support.converter.MessageConversionException; import org.springframework.jms.support.converter.MessageConversionException;
import org.springframework.jms.support.converter.MessageConverter; import org.springframework.jms.support.converter.MessageConverter;
import org.springframework.jms.support.converter.MessagingMessageConverter; import org.springframework.jms.support.converter.MessagingMessageConverter;
import org.springframework.jms.support.converter.SimpleJmsHeaderMapper;
import org.springframework.jms.support.converter.SimpleMessageConverter; import org.springframework.jms.support.converter.SimpleMessageConverter;
import org.springframework.jms.support.destination.DestinationResolver; import org.springframework.jms.support.destination.DestinationResolver;
import org.springframework.jms.support.destination.DynamicDestinationResolver; import org.springframework.jms.support.destination.DynamicDestinationResolver;
@ -59,18 +59,11 @@ public abstract class AbstractAdaptableMessageListener
private DestinationResolver destinationResolver = new DynamicDestinationResolver(); private DestinationResolver destinationResolver = new DynamicDestinationResolver();
private MessageConverter messageConverter; private MessageConverter messageConverter = new SimpleMessageConverter();
private MessagingMessageConverterAdapter messagingMessageConverter = new MessagingMessageConverterAdapter(); private final MessagingMessageConverterAdapter messagingMessageConverter = new MessagingMessageConverterAdapter();
/**
* Create a new instance with default settings.
*/
protected AbstractAdaptableMessageListener() {
initDefaultStrategies();
}
/** /**
* Set the default destination to send response messages to. This will be applied * 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. * in case of a request message that does not carry a "JMSReplyTo" field.
@ -153,14 +146,9 @@ public abstract class AbstractAdaptableMessageListener
return this.messageConverter; return this.messageConverter;
} }
protected MessageConverter getMessagingMessageConverter() {
return this.messagingMessageConverter;
}
/** /**
* Set the {@link JmsHeaderMapper} implementation to use to map the * Set the {@link JmsHeaderMapper} implementation to use to map the standard
* standard JMS headers. By default {@link SimpleJmsHeaderMapper} is * JMS headers. By default, a {@link SimpleJmsHeaderMapper} is used.
* used
* @see SimpleJmsHeaderMapper * @see SimpleJmsHeaderMapper
*/ */
public void setHeaderMapper(JmsHeaderMapper headerMapper) { public void setHeaderMapper(JmsHeaderMapper headerMapper) {
@ -168,6 +156,15 @@ public abstract class AbstractAdaptableMessageListener
this.messagingMessageConverter.setHeaderMapper(headerMapper); this.messagingMessageConverter.setHeaderMapper(headerMapper);
} }
/**
* Return the{@link MessagingMessageConverter} for this listener,
* being able to convert {@link org.springframework.messaging.Message}.
*/
protected final MessagingMessageConverter getMessagingMessageConverter() {
return this.messagingMessageConverter;
}
/** /**
* Standard JMS {@link MessageListener} entry point. * Standard JMS {@link MessageListener} entry point.
* <p>Delegates the message to the target listener method, with appropriate * <p>Delegates the message to the target listener method, with appropriate
@ -191,15 +188,6 @@ public abstract class AbstractAdaptableMessageListener
} }
} }
/**
* Initialize the default implementations for the adapter's strategies.
* @see #setMessageConverter
* @see org.springframework.jms.support.converter.SimpleMessageConverter
*/
protected void initDefaultStrategies() {
setMessageConverter(new SimpleMessageConverter());
}
/** /**
* Handle the given exception that arose during listener execution. * Handle the given exception that arose during listener execution.
* The default implementation logs the exception at error level. * The default implementation logs the exception at error level.
@ -228,8 +216,8 @@ public abstract class AbstractAdaptableMessageListener
} }
return message; return message;
} }
catch (JMSException e) { catch (JMSException ex) {
throw new MessageConversionException("Could not unmarshal message", e); throw new MessageConversionException("Could not unmarshal message", ex);
} }
} }
@ -257,8 +245,8 @@ public abstract class AbstractAdaptableMessageListener
Destination destination = getResponseDestination(request, response, session); Destination destination = getResponseDestination(request, response, session);
sendResponse(session, destination, response); sendResponse(session, destination, response);
} }
catch (Exception e) { catch (Exception ex) {
throw new ReplyFailureException("Failed to send reply with payload '" + result + "'", e); throw new ReplyFailureException("Failed to send reply with payload '" + result + "'", ex);
} }
} }
else { else {
@ -410,6 +398,7 @@ public abstract class AbstractAdaptableMessageListener
} }
} }
/** /**
* Internal class combining a destination name * Internal class combining a destination name
* and its target destination type (queue or topic). * and its target destination type (queue or topic).

View File

@ -17,7 +17,6 @@
package org.springframework.jms.listener.adapter; package org.springframework.jms.listener.adapter;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import javax.jms.JMSException; import javax.jms.JMSException;
import javax.jms.Message; import javax.jms.Message;
import javax.jms.MessageListener; import javax.jms.MessageListener;
@ -137,7 +136,6 @@ public class MessageListenerAdapter extends AbstractAdaptableMessageListener
* Create a new {@link MessageListenerAdapter} with default settings. * Create a new {@link MessageListenerAdapter} with default settings.
*/ */
public MessageListenerAdapter() { public MessageListenerAdapter() {
initDefaultStrategies();
this.delegate = this; this.delegate = this;
} }
@ -146,7 +144,6 @@ public class MessageListenerAdapter extends AbstractAdaptableMessageListener
* @param delegate the delegate object * @param delegate the delegate object
*/ */
public MessageListenerAdapter(Object delegate) { public MessageListenerAdapter(Object delegate) {
initDefaultStrategies();
setDelegate(delegate); setDelegate(delegate);
} }

View File

@ -19,7 +19,7 @@ package org.springframework.jms.listener.adapter;
import javax.jms.JMSException; import javax.jms.JMSException;
import javax.jms.Session; import javax.jms.Session;
import org.springframework.jms.support.converter.JmsHeaderMapper; import org.springframework.jms.support.JmsHeaderMapper;
import org.springframework.jms.support.converter.MessageConversionException; import org.springframework.jms.support.converter.MessageConversionException;
import org.springframework.messaging.Message; import org.springframework.messaging.Message;
import org.springframework.messaging.MessagingException; import org.springframework.messaging.MessagingException;
@ -56,6 +56,7 @@ public class MessagingMessageListenerAdapter extends AbstractAdaptableMessageLis
this.handlerMethod = handlerMethod; this.handlerMethod = handlerMethod;
} }
@Override @Override
public void onMessage(javax.jms.Message jmsMessage, Session session) throws JMSException { public void onMessage(javax.jms.Message jmsMessage, Session session) throws JMSException {
Message<?> message = toMessagingMessage(jmsMessage); Message<?> message = toMessagingMessage(jmsMessage);
@ -76,34 +77,34 @@ public class MessagingMessageListenerAdapter extends AbstractAdaptableMessageLis
try { try {
return (Message<?>) getMessagingMessageConverter().fromMessage(jmsMessage); return (Message<?>) getMessagingMessageConverter().fromMessage(jmsMessage);
} }
catch (JMSException e) { catch (JMSException ex) {
throw new MessageConversionException("Could not unmarshal message", e); throw new MessageConversionException("Could not unmarshal message", ex);
} }
} }
/** /**
* Invoke the handler, wrapping any exception to a {@link ListenerExecutionFailedException} with * Invoke the handler, wrapping any exception to a {@link ListenerExecutionFailedException}
* a dedicated error message. * with a dedicated error message.
*/ */
private Object invokeHandler(javax.jms.Message jmsMessage, Session session, Message<?> message) { private Object invokeHandler(javax.jms.Message jmsMessage, Session session, Message<?> message) {
try { try {
return handlerMethod.invoke(message, jmsMessage, session); return this.handlerMethod.invoke(message, jmsMessage, session);
} }
catch (MessagingException e) { catch (MessagingException ex) {
throw new ListenerExecutionFailedException(createMessagingErrorMessage("Listener method could not " + throw new ListenerExecutionFailedException(createMessagingErrorMessage("Listener method could not " +
"be invoked with the incoming message"), e); "be invoked with the incoming message"), ex);
} }
catch (Exception e) { catch (Exception ex) {
throw new ListenerExecutionFailedException("Listener method '" throw new ListenerExecutionFailedException("Listener method '" +
+ handlerMethod.getMethod().toGenericString() + "' threw exception", e); this.handlerMethod.getMethod().toGenericString() + "' threw exception", ex);
} }
} }
private String createMessagingErrorMessage(String description) { private String createMessagingErrorMessage(String description) {
StringBuilder sb = new StringBuilder(description).append("\n") StringBuilder sb = new StringBuilder(description).append("\n")
.append("Endpoint handler details:\n") .append("Endpoint handler details:\n")
.append("Method [").append(handlerMethod.getMethod()).append("]\n") .append("Method [").append(this.handlerMethod.getMethod()).append("]\n")
.append("Bean [").append(handlerMethod.getBean()).append("]\n"); .append("Bean [").append(this.handlerMethod.getBean()).append("]\n");
return sb.toString(); return sb.toString();
} }

View File

@ -1,20 +0,0 @@
/*
* Copyright 2002-2014 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* JMS integration for Spring's messaging module.
*/
package org.springframework.jms.messaging;

View File

@ -14,11 +14,11 @@
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.jms.support.converter; package org.springframework.jms.support;
import javax.jms.Message; import javax.jms.Message;
import org.springframework.messaging.mapping.HeaderMapper; import org.springframework.messaging.support.HeaderMapper;
/** /**
* Strategy interface for mapping messaging Message headers to an outbound * Strategy interface for mapping messaging Message headers to an outbound

View File

@ -14,11 +14,11 @@
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.jms.support.converter; package org.springframework.jms.support;
/** /**
* Pre-defined names and prefixes to be used for setting and/or retrieving JMS * Pre-defined names and prefixes to be used for setting and/or retrieving
* attributes from/to integration Message Headers. * JMS attributes from/to generic message headers.
* *
* @author Mark Fisher * @author Mark Fisher
* @author Stephane Nicoll * @author Stephane Nicoll
@ -43,7 +43,7 @@ public interface JmsHeaders {
/** /**
* Name of the destination (topic or queue) of the message. * Name of the destination (topic or queue) of the message.
* <p>Read only value. * <p>Read-only value.
* @see javax.jms.Message#getJMSDestination() * @see javax.jms.Message#getJMSDestination()
* @see javax.jms.Destination * @see javax.jms.Destination
* @see javax.jms.Queue * @see javax.jms.Queue
@ -53,7 +53,7 @@ public interface JmsHeaders {
/** /**
* Distribution mode. * Distribution mode.
* <p>Read only value. * <p>Read-only value.
* @see javax.jms.Message#getJMSDeliveryMode() * @see javax.jms.Message#getJMSDeliveryMode()
* @see javax.jms.DeliveryMode * @see javax.jms.DeliveryMode
*/ */
@ -61,21 +61,21 @@ public interface JmsHeaders {
/** /**
* Message expiration date and time. * Message expiration date and time.
* <p>Read only value. * <p>Read-only value.
* @see javax.jms.Message#getJMSExpiration() * @see javax.jms.Message#getJMSExpiration()
*/ */
public static final String EXPIRATION = PREFIX + "expiration"; public static final String EXPIRATION = PREFIX + "expiration";
/** /**
* Unique Identifier for a message. * Unique Identifier for a message.
* <p>Read only value. * <p>Read-only value.
* @see javax.jms.Message#getJMSMessageID() * @see javax.jms.Message#getJMSMessageID()
*/ */
public static final String MESSAGE_ID = PREFIX + "messageId"; public static final String MESSAGE_ID = PREFIX + "messageId";
/** /**
* The message priority level. * The message priority level.
* <p>Read only value. * <p>Read-only value.
* @see javax.jms.Message#getJMSPriority() * @see javax.jms.Message#getJMSPriority()
*/ */
public static final String PRIORITY = PREFIX + "priority"; public static final String PRIORITY = PREFIX + "priority";
@ -90,7 +90,7 @@ public interface JmsHeaders {
/** /**
* Specify if the message was resent. This occurs when a message * Specify if the message was resent. This occurs when a message
* consumer fails to acknowledge the message reception. * consumer fails to acknowledge the message reception.
* <p>Read only value. * <p>Read-only value.
* @see javax.jms.Message#getJMSRedelivered() * @see javax.jms.Message#getJMSRedelivered()
*/ */
public static final String REDELIVERED = PREFIX + "redelivered"; public static final String REDELIVERED = PREFIX + "redelivered";
@ -104,7 +104,7 @@ public interface JmsHeaders {
/** /**
* Date and time of the message sending operation. * Date and time of the message sending operation.
* <p>Read only value. * <p>Read-only value.
* @see javax.jms.Message#getJMSTimestamp() * @see javax.jms.Message#getJMSTimestamp()
*/ */
public static final String TIMESTAMP = PREFIX + "timestamp"; public static final String TIMESTAMP = PREFIX + "timestamp";

View File

@ -18,10 +18,8 @@ package org.springframework.jms.support;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import javax.jms.Destination; import javax.jms.Destination;
import org.springframework.jms.support.converter.JmsHeaders;
import org.springframework.messaging.Message; import org.springframework.messaging.Message;
import org.springframework.messaging.support.NativeMessageHeaderAccessor; import org.springframework.messaging.support.NativeMessageHeaderAccessor;
@ -43,14 +41,6 @@ public class JmsMessageHeaderAccessor extends NativeMessageHeaderAccessor {
} }
/**
* Create {@link JmsMessageHeaderAccessor} from the headers of an existing message.
*/
public static JmsMessageHeaderAccessor wrap(Message<?> message) {
return new JmsMessageHeaderAccessor(message);
}
/** /**
* Return the {@link JmsHeaders#CORRELATION_ID correlationId}. * Return the {@link JmsHeaders#CORRELATION_ID correlationId}.
* @see JmsHeaders#CORRELATION_ID * @see JmsHeaders#CORRELATION_ID
@ -131,4 +121,14 @@ public class JmsMessageHeaderAccessor extends NativeMessageHeaderAccessor {
return (Long) getHeader(JmsHeaders.TIMESTAMP); return (Long) getHeader(JmsHeaders.TIMESTAMP);
} }
// Static factory method
/**
* Create a {@link JmsMessageHeaderAccessor} from the headers of an existing message.
*/
public static JmsMessageHeaderAccessor wrap(Message<?> message) {
return new JmsMessageHeaderAccessor(message);
}
} }

View File

@ -14,15 +14,14 @@
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.jms.support.converter; package org.springframework.jms.support;
import java.util.Arrays; import java.util.Arrays;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import javax.jms.Destination; import javax.jms.Destination;
import javax.jms.JMSException; import javax.jms.JMSException;
@ -34,16 +33,16 @@ import org.springframework.util.StringUtils;
/** /**
* Simple implementation of {@link JmsHeaderMapper}. * Simple implementation of {@link JmsHeaderMapper}.
* <p> *
* This implementation copies JMS API headers (e.g. JMSReplyTo) to and from * <p>This implementation copies JMS API headers (e.g. JMSReplyTo) to and from
* {@link org.springframework.messaging.Message Messages}. Any user-defined * {@link org.springframework.messaging.Message Messages}. Any user-defined
* properties will also be copied from a JMS Message to a Message, and any * properties will also be copied from a JMS Message to a Message, and any
* other headers on a Message (beyond the JMS API headers) will likewise * other headers on a Message (beyond the JMS API headers) will likewise
* be copied to a JMS Message. Those other headers will be copied to the * be copied to a JMS Message. Those other headers will be copied to the
* general properties of a JMS Message whereas the JMS API headers are passed * general properties of a JMS Message whereas the JMS API headers are passed
* to the appropriate setter methods (e.g. setJMSReplyTo). * to the appropriate setter methods (e.g. setJMSReplyTo).
* <p> *
* Constants for the JMS API headers are defined in {@link JmsHeaders}. * <p>Constants for the JMS API headers are defined in {@link JmsHeaders}.
* Note that most of the JMS headers are read-only: the JMSDestination, * Note that most of the JMS headers are read-only: the JMSDestination,
* JMSDeliveryMode, JMSExpiration, JMSMessageID, JMSPriority, JMSRedelivered * JMSDeliveryMode, JMSExpiration, JMSMessageID, JMSPriority, JMSRedelivered
* and JMSTimestamp flags are only copied <em>from</em> a JMS Message. Those * and JMSTimestamp flags are only copied <em>from</em> a JMS Message. Those
@ -51,51 +50,47 @@ import org.springframework.util.StringUtils;
* JMS Message. * JMS Message.
* *
* @author Mark Fisher * @author Mark Fisher
* @author Gary Russel * @author Gary Russell
* @since 4.1 * @since 4.1
*/ */
public class SimpleJmsHeaderMapper implements JmsHeaderMapper { public class SimpleJmsHeaderMapper implements JmsHeaderMapper {
private static List<Class<?>> SUPPORTED_PROPERTY_TYPES = Arrays.asList(new Class<?>[] { private static Set<Class<?>> SUPPORTED_PROPERTY_TYPES = new HashSet<Class<?>>(Arrays.asList(new Class<?>[] {
Boolean.class, Byte.class, Double.class, Float.class, Integer.class, Long.class, Short.class, String.class}); Boolean.class, Byte.class, Double.class, Float.class, Integer.class, Long.class, Short.class, String.class}));
private final Log logger = LogFactory.getLog(this.getClass()); private final Log logger = LogFactory.getLog(getClass());
private volatile String inboundPrefix = ""; private String inboundPrefix = "";
private String outboundPrefix = "";
private volatile String outboundPrefix = "";
/** /**
* Specify a prefix to be appended to the message header name for any * Specify a prefix to be appended to the message header name for any
* JMS property that is being mapped into the MessageHeaders. The * JMS property that is being mapped into the MessageHeaders. The
* default is an empty string (no prefix). * default is an empty string (no prefix).
* <p> * <p>This does not affect the JMS properties covered by the specification/API,
* This does not affect the JMS properties covered by the specification/API,
* such as JMSCorrelationID, etc. The header names used for mapping such * such as JMSCorrelationID, etc. The header names used for mapping such
* properties are all defined in our {@link JmsHeaders}. * properties are all defined in our {@link org.springframework.jms.support.JmsHeaders}.
*
* @param inboundPrefix The inbound prefix.
*/ */
public void setInboundPrefix(String inboundPrefix) { public void setInboundPrefix(String inboundPrefix) {
this.inboundPrefix = (inboundPrefix != null) ? inboundPrefix : ""; this.inboundPrefix = (inboundPrefix != null ? inboundPrefix : "");
} }
/** /**
* Specify a prefix to be appended to the JMS property name for any * Specify a prefix to be appended to the JMS property name for any
* message header that is being mapped into the JMS Message. The * message header that is being mapped into the JMS Message. The
* default is an empty string (no prefix). * default is an empty string (no prefix).
* <p> * <p>This does not affect the JMS properties covered by the specification/API,
* This does not affect the JMS properties covered by the specification/API,
* such as JMSCorrelationID, etc. The header names used for mapping such * such as JMSCorrelationID, etc. The header names used for mapping such
* properties are all defined in our {@link JmsHeaders}. * properties are all defined in our {@link org.springframework.jms.support.JmsHeaders}.
*
* @param outboundPrefix The outbound prefix.
*/ */
public void setOutboundPrefix(String outboundPrefix) { public void setOutboundPrefix(String outboundPrefix) {
this.outboundPrefix = (outboundPrefix != null) ? outboundPrefix : ""; this.outboundPrefix = (outboundPrefix != null ? outboundPrefix : "");
} }
@Override @Override
public void fromHeaders(MessageHeaders headers, javax.jms.Message jmsMessage) { public void fromHeaders(MessageHeaders headers, javax.jms.Message jmsMessage) {
try { try {
@ -152,15 +147,15 @@ public class SimpleJmsHeaderMapper implements JmsHeaderMapper {
} }
} }
} }
catch (Exception e) { catch (Exception ex) {
if (logger.isWarnEnabled()) { if (logger.isWarnEnabled()) {
logger.warn("error occurred while mapping from MessageHeaders to JMS properties", e); logger.warn("error occurred while mapping from MessageHeaders to JMS properties", ex);
} }
} }
} }
@Override @Override
public Map<String, Object> toHeaders(javax.jms.Message jmsMessage) { public MessageHeaders toHeaders(javax.jms.Message jmsMessage) {
Map<String, Object> headers = new HashMap<String, Object>(); Map<String, Object> headers = new HashMap<String, Object>();
try { try {
try { try {
@ -169,8 +164,8 @@ public class SimpleJmsHeaderMapper implements JmsHeaderMapper {
headers.put(JmsHeaders.CORRELATION_ID, correlationId); headers.put(JmsHeaders.CORRELATION_ID, correlationId);
} }
} }
catch (Exception e) { catch (Exception ex) {
logger.info("failed to read JMSCorrelationID property, skipping", e); logger.info("failed to read JMSCorrelationID property, skipping", ex);
} }
try { try {
Destination destination = jmsMessage.getJMSDestination(); Destination destination = jmsMessage.getJMSDestination();
@ -178,22 +173,22 @@ public class SimpleJmsHeaderMapper implements JmsHeaderMapper {
headers.put(JmsHeaders.DESTINATION, destination); headers.put(JmsHeaders.DESTINATION, destination);
} }
} }
catch (Exception e) { catch (Exception ex) {
logger.info("failed to read JMSDestination property, skipping", e); logger.info("failed to read JMSDestination property, skipping", ex);
} }
try { try {
int deliveryMode = jmsMessage.getJMSDeliveryMode(); int deliveryMode = jmsMessage.getJMSDeliveryMode();
headers.put(JmsHeaders.DELIVERY_MODE, deliveryMode); headers.put(JmsHeaders.DELIVERY_MODE, deliveryMode);
} }
catch (Exception e) { catch (Exception ex) {
logger.info("failed to read JMSDeliveryMode property, skipping", e); logger.info("failed to read JMSDeliveryMode property, skipping", ex);
} }
try { try {
long expiration = jmsMessage.getJMSExpiration(); long expiration = jmsMessage.getJMSExpiration();
headers.put(JmsHeaders.EXPIRATION, expiration); headers.put(JmsHeaders.EXPIRATION, expiration);
} }
catch (Exception e) { catch (Exception ex) {
logger.info("failed to read JMSExpiration property, skipping", e); logger.info("failed to read JMSExpiration property, skipping", ex);
} }
try { try {
String messageId = jmsMessage.getJMSMessageID(); String messageId = jmsMessage.getJMSMessageID();
@ -201,14 +196,14 @@ public class SimpleJmsHeaderMapper implements JmsHeaderMapper {
headers.put(JmsHeaders.MESSAGE_ID, messageId); headers.put(JmsHeaders.MESSAGE_ID, messageId);
} }
} }
catch (Exception e) { catch (Exception ex) {
logger.info("failed to read JMSMessageID property, skipping", e); logger.info("failed to read JMSMessageID property, skipping", ex);
} }
try { try {
headers.put(JmsHeaders.PRIORITY, jmsMessage.getJMSPriority()); headers.put(JmsHeaders.PRIORITY, jmsMessage.getJMSPriority());
} }
catch (Exception e) { catch (Exception ex) {
logger.info("failed to read JMSPriority property, skipping", e); logger.info("failed to read JMSPriority property, skipping", ex);
} }
try { try {
Destination replyTo = jmsMessage.getJMSReplyTo(); Destination replyTo = jmsMessage.getJMSReplyTo();
@ -216,14 +211,14 @@ public class SimpleJmsHeaderMapper implements JmsHeaderMapper {
headers.put(JmsHeaders.REPLY_TO, replyTo); headers.put(JmsHeaders.REPLY_TO, replyTo);
} }
} }
catch (Exception e) { catch (Exception ex) {
logger.info("failed to read JMSReplyTo property, skipping", e); logger.info("failed to read JMSReplyTo property, skipping", ex);
} }
try { try {
headers.put(JmsHeaders.REDELIVERED, jmsMessage.getJMSRedelivered()); headers.put(JmsHeaders.REDELIVERED, jmsMessage.getJMSRedelivered());
} }
catch (Exception e) { catch (Exception ex) {
logger.info("failed to read JMSRedelivered property, skipping", e); logger.info("failed to read JMSRedelivered property, skipping", ex);
} }
try { try {
String type = jmsMessage.getJMSType(); String type = jmsMessage.getJMSType();
@ -231,14 +226,14 @@ public class SimpleJmsHeaderMapper implements JmsHeaderMapper {
headers.put(JmsHeaders.TYPE, type); headers.put(JmsHeaders.TYPE, type);
} }
} }
catch (Exception e) { catch (Exception ex) {
logger.info("failed to read JMSType property, skipping", e); logger.info("failed to read JMSType property, skipping", ex);
} }
try { try {
headers.put(JmsHeaders.TIMESTAMP, jmsMessage.getJMSTimestamp()); headers.put(JmsHeaders.TIMESTAMP, jmsMessage.getJMSTimestamp());
} }
catch (Exception e) { catch (Exception ex) {
logger.info("failed to read JMSTimestamp property, skipping", e); logger.info("failed to read JMSTimestamp property, skipping", ex);
} }
@ -250,21 +245,21 @@ public class SimpleJmsHeaderMapper implements JmsHeaderMapper {
String headerName = this.toHeaderName(propertyName); String headerName = this.toHeaderName(propertyName);
headers.put(headerName, jmsMessage.getObjectProperty(propertyName)); headers.put(headerName, jmsMessage.getObjectProperty(propertyName));
} }
catch (Exception e) { catch (Exception ex) {
if (logger.isWarnEnabled()) { if (logger.isWarnEnabled()) {
logger.warn("error occurred while mapping JMS property '" logger.warn("Error occurred while mapping JMS property '" + propertyName +
+ propertyName + "' to Message header", e); "' to Message header", ex);
} }
} }
} }
} }
} }
catch (JMSException e) { catch (JMSException ex) {
if (logger.isWarnEnabled()) { if (logger.isWarnEnabled()) {
logger.warn("error occurred while mapping from JMS properties to MessageHeaders", e); logger.warn("Error occurred while mapping from JMS properties to MessageHeaders", ex);
} }
} }
return headers; return new MessageHeaders(headers);
} }
/** /**

View File

@ -17,19 +17,20 @@
package org.springframework.jms.support.converter; package org.springframework.jms.support.converter;
import java.util.Map; import java.util.Map;
import javax.jms.JMSException; import javax.jms.JMSException;
import javax.jms.Session; import javax.jms.Session;
import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.InitializingBean;
import org.springframework.jms.support.JmsHeaderMapper;
import org.springframework.jms.support.SimpleJmsHeaderMapper;
import org.springframework.messaging.Message; import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder; import org.springframework.messaging.support.MessageBuilder;
import org.springframework.util.Assert; import org.springframework.util.Assert;
/** /**
* Convert a {@link Message} from the messaging abstraction to * Convert a {@link Message} from the messaging abstraction to and from a
* and from a {@link javax.jms.Message} using an underlying * {@link javax.jms.Message} using an underlying {@link MessageConverter}
* {@link MessageConverter} for the payload and a {@link JmsHeaderMapper} * for the payload and a {@link org.springframework.jms.support.JmsHeaderMapper}
* to map the JMS headers to and from standard message headers. * to map the JMS headers to and from standard message headers.
* *
* @author Stephane Nicoll * @author Stephane Nicoll
@ -41,10 +42,11 @@ public class MessagingMessageConverter implements MessageConverter, Initializing
private JmsHeaderMapper headerMapper; private JmsHeaderMapper headerMapper;
/** /**
* Create an instance with a default payload converter. * Create an instance with a default payload converter.
* @see org.springframework.jms.support.converter.SimpleMessageConverter * @see org.springframework.jms.support.converter.SimpleMessageConverter
* @see org.springframework.jms.support.converter.SimpleJmsHeaderMapper * @see org.springframework.jms.support.SimpleJmsHeaderMapper
*/ */
public MessagingMessageConverter() { public MessagingMessageConverter() {
this(new SimpleMessageConverter(), new SimpleJmsHeaderMapper()); this(new SimpleMessageConverter(), new SimpleJmsHeaderMapper());
@ -61,6 +63,7 @@ public class MessagingMessageConverter implements MessageConverter, Initializing
this.headerMapper = headerMapper; this.headerMapper = headerMapper;
} }
/** /**
* Set the {@link MessageConverter} to use to convert the payload. * Set the {@link MessageConverter} to use to convert the payload.
*/ */
@ -82,13 +85,13 @@ public class MessagingMessageConverter implements MessageConverter, Initializing
Assert.notNull(this.headerMapper, "Property 'headerMapper' is required"); Assert.notNull(this.headerMapper, "Property 'headerMapper' is required");
} }
@Override @Override
public javax.jms.Message toMessage(Object object, Session session) throws JMSException, MessageConversionException { public javax.jms.Message toMessage(Object object, Session session) throws JMSException, MessageConversionException {
if (!(object instanceof Message)) { if (!(object instanceof Message)) {
throw new IllegalArgumentException("Could not convert [" + object + "] only [" throw new IllegalArgumentException("Could not convert [" + object + "] - only [" +
+ Message.class.getName() + "] is handled by this converter"); Message.class.getName() + "] is handled by this converter");
} }
Message<?> input = (Message<?>) object; Message<?> input = (Message<?>) object;
javax.jms.Message reply = this.payloadConverter.toMessage(input.getPayload(), session); javax.jms.Message reply = this.payloadConverter.toMessage(input.getPayload(), session);
this.headerMapper.fromHeaders(input.getHeaders(), reply); this.headerMapper.fromHeaders(input.getHeaders(), reply);
@ -110,7 +113,7 @@ public class MessagingMessageConverter implements MessageConverter, Initializing
} }
/** /**
* Extract the payload of the specified {@link javax.jms.Message} * Extract the payload of the specified {@link javax.jms.Message}.
*/ */
protected Object extractPayload(javax.jms.Message message) throws JMSException { protected Object extractPayload(javax.jms.Message message) throws JMSException {
return this.payloadConverter.fromMessage(message); return this.payloadConverter.fromMessage(message);

View File

@ -50,7 +50,7 @@ import org.springframework.jms.listener.adapter.ReplyFailureException;
import org.springframework.jms.listener.adapter.ListenerExecutionFailedException; import org.springframework.jms.listener.adapter.ListenerExecutionFailedException;
import org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter; import org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter;
import org.springframework.jms.support.JmsMessageHeaderAccessor; import org.springframework.jms.support.JmsMessageHeaderAccessor;
import org.springframework.jms.support.converter.JmsHeaders; import org.springframework.jms.support.JmsHeaders;
import org.springframework.jms.support.destination.DestinationResolver; import org.springframework.jms.support.destination.DestinationResolver;
import org.springframework.messaging.Message; import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHeaders; import org.springframework.messaging.MessageHeaders;

View File

@ -14,12 +14,11 @@
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.jms.messaging; package org.springframework.jms.core;
import java.io.Writer; import java.io.Writer;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import javax.jms.Destination; import javax.jms.Destination;
import javax.jms.JMSException; import javax.jms.JMSException;
import javax.jms.Session; import javax.jms.Session;
@ -36,10 +35,8 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.mockito.invocation.InvocationOnMock; import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer; import org.mockito.stubbing.Answer;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.jms.StubTextMessage; import org.springframework.jms.StubTextMessage;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.jms.support.converter.MessageConversionException; import org.springframework.jms.support.converter.MessageConversionException;
import org.springframework.jms.support.converter.SimpleMessageConverter; import org.springframework.jms.support.converter.SimpleMessageConverter;
import org.springframework.messaging.Message; import org.springframework.messaging.Message;
@ -317,7 +314,7 @@ public class JmsMessagingTemplateTests {
javax.jms.Message jmsMessage = createJmsTextMessage("123"); javax.jms.Message jmsMessage = createJmsTextMessage("123");
given(jmsTemplate.receive("myQueue")).willReturn(jmsMessage); given(jmsTemplate.receive("myQueue")).willReturn(jmsMessage);
messagingTemplate.setMessageConverter(new GenericMessageConverter(new DefaultConversionService())); messagingTemplate.setMessageConverter(new GenericMessageConverter());
Integer payload = messagingTemplate.receiveAndConvert("myQueue", Integer.class); Integer payload = messagingTemplate.receiveAndConvert("myQueue", Integer.class);
assertEquals(Integer.valueOf(123), payload); assertEquals(Integer.valueOf(123), payload);

View File

@ -26,7 +26,6 @@ import javax.jms.JMSException;
import org.junit.Test; import org.junit.Test;
import org.springframework.jms.StubTextMessage; import org.springframework.jms.StubTextMessage;
import org.springframework.jms.support.converter.SimpleJmsHeaderMapper;
import org.springframework.messaging.Message; import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder; import org.springframework.messaging.support.MessageBuilder;

View File

@ -14,13 +14,10 @@
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.jms.support.converter; package org.springframework.jms.support;
import static org.junit.Assert.*;
import java.util.Date; import java.util.Date;
import java.util.Map; import java.util.Map;
import javax.jms.DeliveryMode; import javax.jms.DeliveryMode;
import javax.jms.Destination; import javax.jms.Destination;
import javax.jms.JMSException; import javax.jms.JMSException;
@ -32,6 +29,8 @@ import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHeaders; import org.springframework.messaging.MessageHeaders;
import org.springframework.messaging.support.MessageBuilder; import org.springframework.messaging.support.MessageBuilder;
import static org.junit.Assert.*;
/** /**
* *
* @author Mark Fisher * @author Mark Fisher
@ -42,6 +41,7 @@ public class SimpleJmsHeaderMapperTests {
private final SimpleJmsHeaderMapper mapper = new SimpleJmsHeaderMapper(); private final SimpleJmsHeaderMapper mapper = new SimpleJmsHeaderMapper();
// Outbound mapping // Outbound mapping
@Test @Test
@ -559,4 +559,5 @@ public class SimpleJmsHeaderMapperTests {
private MessageBuilder<String> initBuilder() { private MessageBuilder<String> initBuilder() {
return MessageBuilder.withPayload("test"); return MessageBuilder.withPayload("test");
} }
} }

View File

@ -1,20 +0,0 @@
/*
* Copyright 2002-2014 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* Provides classes related to mapping to/from message headers.
*/
package org.springframework.messaging.mapping;

View File

@ -14,9 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.messaging.mapping; package org.springframework.messaging.support;
import java.util.Map;
import org.springframework.messaging.MessageHeaders; import org.springframework.messaging.MessageHeaders;
@ -26,12 +24,23 @@ import org.springframework.messaging.MessageHeaders;
* has a concept of headers or properties (HTTP, JMS, AMQP, etc). * has a concept of headers or properties (HTTP, JMS, AMQP, etc).
* *
* @author Mark Fisher * @author Mark Fisher
* @param <T> type of the instance to and from which headers will be mapped. * @since 4.1
* @param <T> type of the instance to and from which headers will be mapped
*/ */
public interface HeaderMapper<T> { public interface HeaderMapper<T> {
/**
* Map from the given {@link MessageHeaders} to the specified target message.
* @param headers the abstracted MessageHeaders
* @param target the native target message
*/
void fromHeaders(MessageHeaders headers, T target); void fromHeaders(MessageHeaders headers, T target);
Map<String, Object> toHeaders(T source); /**
* Map from the given target message to abstracted {@link MessageHeaders}.
* @param source the native target message
* @return the abstracted MessageHeaders
*/
MessageHeaders toHeaders(T source);
} }