メッセージの送信
JmsTemplate
には、メッセージを送信するための多くの便利なメソッドが含まれています。送信メソッドは、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
には、メッセージのデータコンテンツの引数として Java オブジェクトを受け取るさまざまな send メソッドがあります。JmsTemplate
のオーバーロードされたメソッド convertAndSend()
および receiveAndConvert()
メソッドは、変換プロセスを MessageConverter
インターフェースのインスタンスに委譲します。このインターフェースは、Java オブジェクトと JMS メッセージの間で変換するための単純な契約を定義します。デフォルトの実装(SimpleMessageConverter
)は、String
と TextMessage
、byte[]
、BytesMessage
の間、および java.util.Map
と MapMessage
の間の変換をサポートします。コンバーターを使用することにより、ユーザーとアプリケーションコードは、JMS を介して送受信されるビジネスオブジェクトに焦点を当てることができ、JMS メッセージとしてどのように表現されるかについての詳細を気にする必要はありません。
現在、サンドボックスには MapMessageConverter
が含まれています。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} } }