發送訊息

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) 支援 StringTextMessagebyte[]BytesMessage 以及 java.util.MapMapMessage 之間的轉換。透過使用轉換器,您和您的應用程式程式碼可以專注於透過 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}
	}
}

使用 SessionCallbackProducerCallback

雖然 send 操作涵蓋了許多常見的使用情境,但您有時可能想要在 JMS SessionMessageProducer 上執行多個操作。SessionCallbackProducerCallback 分別公開 JMS SessionSession / MessageProducer 配對。JmsTemplate 上的 execute() 方法執行這些回呼方法。