發送訊息
JmsTemplate
包含許多便利方法來發送訊息。Send 方法透過使用 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)
會將訊息發送到該目的地。
使用訊息轉換器
為了方便發送網域模型物件,JmsTemplate
有各種 send 方法,這些方法將 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 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} } }