?
This document uses PHP Chinese website manual Release
JmsTemplate
包含許多方便的方法來發(fā)送消息。有些發(fā)送方法可以使用 javax.jms.Destination
對象指定目的地,也可以使用字符串在JNDI中查找目的地。沒有目的地參數(shù)的發(fā)送方法使用默認(rèn)的目的地。這里有個例子使用1.0.2版的JMS實現(xiàn)發(fā)送消息到一個隊列。
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; import org.springframework.jms.core.JmsTemplate102; public class JmsQueueSender { private JmsTemplate jmsTemplate; private Queue queue; public void setConnectionFactory(ConnectionFactory cf) { this.jmsTemplate = new JmsTemplate102(cf, false); } 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
回調(diào)接口從提供的 Session
對象中創(chuàng)建一個文本消息,并且通過一個 ConnectionFactory
的引用和指定消息域的布爾值來創(chuàng)建 JmsTemplate
。提供了一個無參數(shù)的構(gòu)造器和 connectionFactory / queue Bean屬性并可用于創(chuàng)建實例(使用一個BeanFactory或者普通Java代碼)?;蛘呖紤]從Spring的基類 JmsGatewaySupport
,它對JMS配置具有內(nèi)置的Bean屬性,繼承一個類。
當(dāng)在應(yīng)用上下文中配置JMS 1.0.2時,重要的是記得設(shè)定布爾屬性 pubSubDomain 的值以指明你是要發(fā)送到隊列還是主題。
方法 send(String destinationName, MessageCreator creator)
讓你利用目的地的字符串名字發(fā)送消息。如果這個名字在JNDI中注冊,你應(yīng)當(dāng)將模板中的 destinationResolver 屬性設(shè)置為 JndiDestinationResolver
的一個實例。
如果你創(chuàng)建 JmsTemplate
并指定一個默認(rèn)的目的地,send(MessageCreator c)
發(fā)送消息到這個目的地。
為便于發(fā)送領(lǐng)域模型對象,JmsTemplate
有多種以一個Java對象為參數(shù)并做為消息數(shù)據(jù)內(nèi)容的發(fā)送方法。JmsTemplate
里可重載的方法 convertAndSend
和 receiveAndConvert
將轉(zhuǎn)換的過程委托給接口 MessageConverter
的一個實例。這個接口定義了一個簡單的合約用來在Java對象和JMS消息間進(jìn)行轉(zhuǎn)換。缺省的實現(xiàn) SimpleMessageConverter
支持 String
和 TextMessage
,byte[]
和 BytesMesssage
,以及 java.util.Map
和 MapMessage
之間的轉(zhuǎn)換。使用轉(zhuǎn)換器,可以使你和你的應(yīng)用關(guān)注于通過JMS接收和發(fā)送的業(yè)務(wù)對象而不用操心它是具體如何表達(dá)成JMS消息的。
目前的沙箱模型包括一個 MapMessageConverter
,它使用反射轉(zhuǎn)換JavaBean和 MapMessage
。其他流行可選的實現(xiàn)方式包括使用已存在的XML編組的包,例如JAXB、Castor、XMLBeans或XStream的轉(zhuǎn)換器來創(chuàng)建一個表示對象的 TextMessage
。
為方便那些不能以通用方式封裝在轉(zhuǎn)換類里的消息屬性,消息頭和消息體的設(shè)置,通過 MessagePostProcessor
接口你可以在消息被轉(zhuǎn)換后并且在發(fā)送前訪問該消息。下例展示了如何在 java.util.Map
已經(jīng)轉(zhuǎn)換成一個消息后更改消息頭和屬性。
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; } }); }
這將產(chǎn)生一個如下的消息格式:
MapMessage={ Header={ ... standard headers ... CorrelationID={123-00001} } Properties={ AccountID={Integer:1234} } Fields={ Name={String:Mark} Age={Integer:47} } }