|
对于最新的稳定版本,请使用 Spring Framework 6.2.10! |
发送消息
这JmsTemplate包含许多发送消息的便捷方法。 发送 方法使用jakarta.jms.Destination对象和其他使用String在 JNDI 查找中。 这send方法 不取 destination 参数使用默认 destination。
以下示例使用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 对象作为消息数据参数的各种 send 方法 内容。 重载的方法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}
}
}
用SessionCallback和ProducerCallback
虽然发送作涵盖了许多常见的使用场景,但有时您可能想要在 JMS 上执行多个作Session或MessageProducer. 这SessionCallback和ProducerCallback公开 JMSSession和Session /
MessageProducer对,分别。 这execute()方法JmsTemplate跑 这些回调方法。