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