发送消息
JmsTemplate
包含许多发送消息的便捷方法。有些发送方法使用 jakarta.jms.Destination
对象指定目标,另一些则使用 JNDI 查找中的 String
指定目标。不接受目标参数的 send
方法使用默认目标。
以下示例使用 MessageCreator
回调从提供的 Session
对象创建文本消息
import jakarta.jms.ConnectionFactory;
import jakarta.jms.JMSException;
import jakarta.jms.Message;
import jakarta.jms.Queue;
import jakarta.jms.Session;
import org.springframework.jms.core.MessageCreator;
import org.springframework.jms.core.JmsTemplate;
public class JmsQueueSender {
private JmsTemplate jmsTemplate;
private Queue queue;
public void setConnectionFactory(ConnectionFactory cf) {
this.jmsTemplate = new JmsTemplate(cf);
}
public void setQueue(Queue queue) {
this.queue = queue;
}
public void simpleSend() {
this.jmsTemplate.send(this.queue, new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage("hello queue world");
}
});
}
}
在上面的示例中,JmsTemplate
通过传递 ConnectionFactory
的引用来构造。作为替代方案,提供了无参构造函数和 connectionFactory
属性,可用于以 JavaBean 风格(使用 BeanFactory
或普通 Java 代码)构造实例。另外,可以考虑从 Spring 的 JmsGatewaySupport
便利基类派生,该基类为 JMS 配置提供了预构建的 bean 属性。
send(String destinationName, MessageCreator creator)
方法允许你使用目标字符串名称发送消息。如果这些名称在 JNDI 中注册,你应该将模板的 destinationResolver
属性设置为 JndiDestinationResolver
的实例。
如果你创建了 JmsTemplate
并指定了默认目标,send(MessageCreator c)
将向该目标发送消息。
使用消息转换器
为了方便发送领域模型对象,JmsTemplate
提供了各种发送方法,这些方法接受 Java 对象作为消息数据内容的参数。JmsTemplate
中的重载方法 convertAndSend()
和 receiveAndConvert()
将转换过程委托给 MessageConverter
接口的实例。该接口定义了一个简单的契约,用于在 Java 对象和 JMS 消息之间进行转换。默认实现 (SimpleMessageConverter
) 支持 String
与 TextMessage
、byte[]
与 BytesMessage
以及 java.util.Map
与 MapMessage
之间的转换。通过使用转换器,你和你的应用代码可以专注于通过 JMS 发送或接收的业务对象,而无需关心它如何表示为 JMS 消息的细节。
当前 sandbox 中包含一个 MapMessageConverter
,它使用反射在 JavaBean 和 MapMessage
之间进行转换。你可能自己实现的其他流行实现选择是使用现有的 XML 编组包(例如 JAXB 或 XStream)来创建表示对象的 TextMessage
的转换器。
为了适应无法在转换器类中通用封装的消息属性、头部和消息体的设置,MessagePostProcessor
接口允许你在消息被转换后但在发送之前访问该消息。以下示例展示了在将 java.util.Map
转换为消息后如何修改消息头部和属性
public void sendWithConversion() {
Map map = new HashMap();
map.put("Name", "Mark");
map.put("Age", new Integer(47));
jmsTemplate.convertAndSend("testQueue", map, new MessagePostProcessor() {
public Message postProcessMessage(Message message) throws JMSException {
message.setIntProperty("AccountID", 1234);
message.setJMSCorrelationID("123-00001");
return message;
}
});
}
这将产生以下形式的消息
MapMessage={ Header={ ... standard headers ... CorrelationID={123-00001} } Properties={ AccountID={Integer:1234} } Fields={ Name={String:Mark} Age={Integer:47} } }