JmsTemplate
包含了许多方法发送消息。有一些发送方法,其指定了目的地,使用了一个javax.jms.Destination
对象并且还有那些使用一个String作为参数,需要JNDI查询。没有指定目的的发送方法使用默认的目的。下面是一个例子,发送消息到一个队列中。
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Queue;
import javax.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");
}
});
}
}
这个例子使用MessageCreator
回调从支持的Session对象中创建文本消息。JmsTemplate
通过传递ConnectionFactory
的引用构建。另外可选地,提供一个缺省的构造器和connectionFactory
并可用于构建JavaBean类型的实例(使用一个BeanFactory或者POJO)。另外,考虑Spring的JmsGatewaySupport
提供的基类,为JMS配置提供了预先内置的bean属性。
send(String destinationName, MessageCreator creator)
方法让你使用目的的名字发送一条消息。如果这些名字在JNDI中注册,你需要给JndiDestinationResolver
的实例设置这个模板的destinationResolver
属性。
如果你创建了JmsTemplate
并且指定了默认的目的,send(MessageCreator c)
发送消息到目的地。
23.3.1 使用消息转换器
为方便发送领域模型对象,JmsTemplate
有不同的发送方法,其针对一个消息的数据内容,以一个Java 对象作为参数。JmsTemplate
中重载的方法convertAndSend()
和receiveAndConvert()
将处理委派给MessageConverter
接口的一个实例。接口定义了一个简单的协议在Java 对象和JMS消息之间进行转换。默认的实现SimpleMessageConverter
支持String
,TextMessage
,byte[]
和BytesMesssage
,java.util.Map
和MapMessage
之间的转换。通过使用这个转化器,你和你的应用程序代码可以专心处理要发送的业务对象或者借助JMS接受的业务对象,而不必关注那些作为一个JMS消息如何如何表示的细节。
包含了MapMessageConverter
的沙箱,使用反射在JavaBean和MapMessage
之间进行转换。其他你可以自己实现的是转换器,其使用了一个已存在的XML组成的包,比如JAXB,Castor,XMLBeans,或者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}
}
}
23.3.2 SessionCallback和ProducerCallback
发送方法囊括了大多数通用的使用场景,也有这些场景,你想在一个JMS的会话或MessageProducer
执行多个操作。SessionCallback
和ProducerCallback分别
暴露JMS会话和成对的Session
/ MessageProducer
。JmsTemplate
上的execute
()方法执行这些回调方法。