Spring JMS入門
1概要
SpringはJMS APIの使用を単純化するJMS統合フレームワークを提供します。この記事では、そのような統合の基本概念を紹介します。
2 Mavenの依存関係
アプリケーションでSpring JMSを使用するには、
pom.xml
に必要なアーティファクトを追加する必要があります。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>
アーティファクトの最新バージョンはhttps://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.springframework%22%20AND%20a%3A%22spring-jms%22[foundです。ここに]。
3
JmsTemplate
JmsTemplate
クラスは、メッセージを送信または同期受信するときにリソースの作成と解放を処理します。
したがって、この
JmsTemplate
を使用するクラスは、メソッド定義で指定されているとおりにコールバックインタフェースを実装するだけで済みます。
Spring 4.1以降、
JmsMessagingTemplate
はメッセージング抽象化との統合を提供する
JmsTemplate
、つまり
org.springframework.messaging.Message
の上に構築されています。これにより、一般的な方法で送信するメッセージを作成できます。
4接続管理
接続してメッセージを送受信できるようにするには、
ConnectionFactory
を設定する必要があります。
ConnectionFactory
は、管理者によって事前設定されているJMS管理対象オブジェクトの1つです。設定の助けを借りて、クライアントはJMSプロバイダとの接続を確立します。
Springは2種類の
ConnectionFactory
を提供します。
-
SingleConnectionFactory –
は、の実装です。
同じ接続を返す
ConnectionFactory
インターフェース
すべての
createConnection
()呼び出し、および
close
()への呼び出しの無視
**
CachingConnectionFactory
– の機能を拡張します
SingleConnectionFactory
を追加すると、
Session
、
MessageProducers
、および
MessageConsumers
のキャッシングによって拡張されます。
5宛先管理
前述のように、
ConnectionFactory
とともに、送り先もJMS管理対象オブジェクトであり、JNDIから格納および取得できます。
Springは
DynamicDestinationResolver
のような一般的なリゾルバと
JndiDestinationResolver
のような特定のリゾルバを提供します。
JmsTemplateは、宛先名の解決を、選択に基づいた実装の1つに委任します。
また、
defaultDestination
というプロパティも提供されます。これは、特定の宛先を参照しない
send
および
receive
オペレーションで使用されます。
6. メッセージ変換
Spring JMSはメッセージコンバータのサポートがなければ不完全です。
ConvertAndSend()および
ReceiveAndConvert()の両方の操作に対して
JmsTemplate
が使用するデフォルトの変換方法は、
SimpleMessageConverter
クラスです。
SimpleMessageConverterは、TextMessages、BytesMessages、MapMessages、およびObjectMessagesを処理できます。このクラスは
MessageConverter
インターフェースを実装します。
SimpleMessageConverter
とは別に、Spring JMSは、
MappingJackson2MessageConverter
、
MarshallingMessageConverter
、
MessagingMessageConverter
など、他にもいくつかの
MessageConverter
クラスを用意しています。
さらに、
MessageConverter
インターフェースの
toMessage()
メソッドと
FromMessage()
メソッドを実装するだけで、カスタムメッセージ変換機能を作成できます。
カスタム
MessageConverter
の実装に関するサンプルコードスニペットを見てみましょう。
public class SampleMessageConverter implements MessageConverter {
public Object fromMessage(Message message)
throws JMSException, MessageConversionException {
//...
}
public Message toMessage(Object object, Session session)
throws JMSException, MessageConversionException {
//...
}
}
7. サンプルSpring JMS
このセクションでは、
JmsTemplate
がメッセージの送受信にどのように使用されるかを説明します。
メッセージを送信するためのデフォルトのメソッドは
JmsTemplate.send()です。 2つの重要なパラメータがあります。1つ目のパラメータはJMSの送り先で、2つ目のパラメータは
MmsageCreatorの実装で、コールバックメソッド__createMessage()を含みます。
JmsTemplate.send()
はプレーンテキストメッセージを送信するのに適していますが、カスタムメッセージを送信するために
JmsTemplate
にはc
__onvertAndSend()
__という別のメソッドがあります。
これらのメソッドの実装は以下の通りです。
public class SampleJmsMessageSender {
private JmsTemplate jmsTemplate;
private Queue queue;
//setters for jmsTemplate & queue
public void simpleSend() {
jmsTemplate.send(queue, s -> s.createTextMessage("hello queue world"));
}
public void sendMessage(Employee employee) {
System.out.println("Jms Message Sender : " + employee);
Map<String, Object> map = new HashMap<>();
map.put("name", employee.getName()); map.put("age", employee.getAge());
jmsTemplate.convertAndSend(map);
}
}
以下はメッセージ受信者クラスです、私達はそれをメッセージ駆動POJO(MDP)と呼びます。
SampleListener
クラスが
MessageListener
インタフェースを実装しており、インタフェースメソッド__onMessage()のテキスト固有の実装を提供していることがわかります。
onMessage()
メソッドとは別に、私たちの
SampleListener
クラスはカスタムメッセージを受け取るためのメソッド
receiveAndConvert()
も呼びました:
public class SampleListener implements MessageListener {
public JmsTemplate getJmsTemplate() {
return getJmsTemplate();
}
public void onMessage(Message message) {
if (message instanceof TextMessage) {
try {
String msg = ((TextMessage) message).getText();
System.out.println("Message has been consumed : " + msg);
} catch (JMSException ex) {
throw new RuntimeException(ex);
}
} else {
throw new IllegalArgumentException("Message Error");
}
}
public Employee receiveMessage() throws JMSException {
Map map = (Map) getJmsTemplate().receiveAndConvert();
return new Employee((String) map.get("name"), (Integer) map.get("age"));
}
}
MessageListener
を実装する方法を説明しました。以下では、Springアプリケーションのコンテキストで設定を確認しています。
<bean id="messageListener" class="com.baeldung.spring.jms.SampleListener"/>
<bean id="jmsContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="destinationName" ref="IN__QUEUE"/>
<property name="messageListener" ref="messageListener"/>
</bean>
DefaultMessageListenerContainer
は、Springが他の多くの特殊なコンテナとともに提供するデフォルトのメッセージリスナコンテナです。
8注釈付きの設定
@ JmsListener
は、通常のBeanのメソッドをJMSリスナーエンドポイントに変換するために必要な唯一のアノテーションです。 Spring JMSは、JMS実装を容易にするために、さらに多くのアノテーションを提供します。下記のクラスに注釈が付けられたサンプルクラスを見ることができます。
@JmsListener(destination = "myDestination")
public void SampleJmsListenerMethod(Message<Order> order) { ... }
単一のメソッドに複数のリスナーを追加するには、複数の
@ JmsListener
アノテーションを追加するだけです。
@ EnableJms
は、上記の
@ JmsListener
アノテーション付きメソッドをサポートするために、構成クラスの1つに追加されたアノテーションです。
@Configuration
@EnableJms
public class AppConfig {
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
DefaultJmsListenerContainerFactory factory
= new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory());
return factory;
}
}
9結論
このチュートリアルでは、Spring JMSの構成と基本概念について説明しました。また、メッセージの送受信に使用されるSpring固有の
JmsTemplate
クラスについても簡単に説明しました。
コードの実装はhttps://github.com/eugenp/tutorials/tree/master/spring-jms[GitHubプロジェクト]にあります。