Sending a Message
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");
}
});
}
}
在上述示例中,通过传递对 ConnectionFactory 的引用来构建 JmsTemplate。作为替代方案,提供了一个零参数构造函数和 connectionFactory,可用于在 JavaBean 样式中(使用 BeanFactory 或纯 Java 代码)构造实例。或者,考虑从 Spring 的 JmsGatewaySupport 便利基础类派生,它提供了用于 JMS 配置的预建 Bean 属性。 send(String destinationName, MessageCreator creator) 方法允许你通过使用目标字符串名称发送消息。如果这些名称在 JNDI 中注册,你应将模板的 destinationResolver 属性设置为 JndiDestinationResolver 的实例。 如果你创建了 JmsTemplate 并指定了默认目标,则 send(MessageCreator c) 会向该目标发送消息。
Using Message Converters
为了便于发送域模型对象,JmsTemplate
有各种发送方法,这些方法以 Java 对象作为消息数据内容的参数。convertAndSend()
和 receiveAndConvert()
方法的重载方法在 JmsTemplate
中将转换过程委派给 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} } }