对于最新的稳定版本,请使用 Spring Framework 6.2.0spring-doc.cn

发送消息

这包含许多发送消息的便捷方法。发送 methods 使用对象指定目的地,其他 通过在 JNDI 查找中使用 来指定目标。方法 ,则不设 destination 参数使用默认 destination。JmsTemplatejakarta.jms.DestinationStringsendspring-doc.cn

以下示例使用回调从 提供的对象:MessageCreatorSessionspring-doc.cn

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");
			}
		});
	}
}

在前面的示例中, the 是通过传递对 .作为替代方案,提供了一个零参数构造函数 and,可用于在 JavaBean 样式(使用或纯 Java 代码)。或者,考虑 派生自 Spring 的 convenience 基类,该基类提供 用于 JMS 配置的预构建 Bean 属性。JmsTemplateConnectionFactoryconnectionFactoryBeanFactoryJmsGatewaySupportspring-doc.cn

该方法允许您发送 message 使用目标的字符串名称。如果这些名称已在 JNDI 中注册,则 您应该将模板的属性设置为 .send(String destinationName, MessageCreator creator)destinationResolverJndiDestinationResolverspring-doc.cn

如果您创建并指定了默认目标,则会向该目标发送消息。JmsTemplatesend(MessageCreator c)spring-doc.cn

使用消息转换器

为了方便发送域模型对象,具有 各种 send 方法,这些方法将 Java 对象作为消息数据的参数 内容。中的重载方法和方法将转换过程委托给接口的实例。此接口定义了一个简单的协定,用于在 Java 对象和 JMS 消息。默认实现 () 支持转换 介于 和 、 和 、 和 之间。通过使用转换器,您和您的应用程序代码可以专注于 业务对象,而不关心 有关如何将其表示为 JMS 消息的详细信息。JmsTemplateconvertAndSend()receiveAndConvert()JmsTemplateMessageConverterSimpleMessageConverterStringTextMessagebyte[]BytesMessagejava.util.MapMapMessagespring-doc.cn

沙箱当前包括一个 ,它使用反射来转换 在 JavaBean 和 .您可能的其他常用实施选择 实现自己的方法是使用现有 XML 封送包(例如 JAXB 或 XStream)创建表示对象的 API。MapMessageConverterMapMessageTextMessagespring-doc.cn

为了适应消息的属性、标头和正文的设置,这些设置不能是 通常封装在 Converter 类中,接口 允许您在消息转换之后但在发送之前访问消息。这 以下示例演示如何在将 a 转换为 Message 后修改 Message 标头和属性:MessagePostProcessorjava.util.Mapspring-doc.cn

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;
		}
	});
}

这将生成以下形式的消息:spring-doc.cn

MapMessage={
	Header={
		... standard headers ...
		CorrelationID={123-00001}
	}
	Properties={
		AccountID={Integer:1234}
	}
	Fields={
		Name={String:Mark}
		Age={Integer:47}
	}
}

使用 和SessionCallbackProducerCallback

虽然 send 操作涵盖了许多常见的使用场景,但有时您可能会 想要对 JMS 执行多个操作或 .和 分别公开 JMS 和 / 对。运行的方法 这些回调方法。SessionMessageProducerSessionCallbackProducerCallbackSessionSessionMessageProducerexecute()JmsTemplatespring-doc.cn