发送消息
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)
会向该目标发送消息。
使用 JMS 消息转换器
为了方便发送领域模型对象,JmsTemplate
具有各种发送方法,这些方法接受 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<String, String> 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} } }