发送消息
JmsTemplate
包含许多用于发送消息的便捷方法。send 方法使用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
具有各种 send 方法,这些方法将 Java 对象作为消息数据内容的参数。JmsTemplate
中重载的方法convertAndSend()
和receiveAndConvert()
将转换过程委托给MessageConverter
接口的实例。此接口定义了一个简单的契约,用于在 Java 对象和 JMS 消息之间进行转换。默认实现(SimpleMessageConverter
)支持在String
和TextMessage
、byte[]
和BytesMessage
以及java.util.Map
和MapMessage
之间进行转换。通过使用转换器,您和您的应用程序代码可以专注于通过 JMS 发送或接收的业务对象,而不必关心它如何表示为 JMS 消息的细节。
沙箱当前包含一个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} } }