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プロジェクト]にあります。