JMS

ConnectionFactory (英語) インターフェースは、JMS ブローカーと対話するための Connection (英語) を作成する標準的な方法を提供します。Spring は JMS を操作するために ConnectionFactory (英語) を必要としますが、通常は自分で直接使用する必要はなく、代わりに高レベルのメッセージング抽象化に頼ることができます。(詳細については、Spring Framework リファレンスドキュメントの関連セクションを参照してください) Spring Boot は、メッセージの送受信に必要なインフラストラクチャも自動的に構成します。

ActiveMQ「クラシック」サポート

ActiveMQ「クラシック」 [Apache] (英語) がクラスパスで使用可能な場合、Spring Boot は ConnectionFactory (英語) を構成できます。ブローカーが存在する場合、組み込みブローカーが自動的に起動および構成されます (構成でブローカー URL が指定されておらず、組み込みブローカーが構成で無効になっていない場合)。

spring-boot-starter-activemq を使用する場合、ActiveMQ "Classic" インスタンスに接続するために必要な依存関係が提供されるほか、JMS と統合するための Spring インフラストラクチャも提供されます。アプリケーションに org.apache.activemq:activemq-broker を追加すると、組み込みブローカーを使用できるようになります。

ActiveMQ の「クラシック」構成は、spring.activemq.*外部構成プロパティによって制御されます。

activemq-broker がクラスパス上にある場合、ActiveMQ "Classic" は VM トランスポート [Apache] (英語) を使用するように自動構成され、同じ JVM インスタンスに埋め込まれたブローカーを起動します。

次の例に示すように、spring.activemq.embedded.enabled プロパティを構成することにより、組み込みブローカーを無効にできます。

  • プロパティ

  • YAML

spring.activemq.embedded.enabled=false
spring:
  activemq:
    embedded:
      enabled: false

次の例に示すように、ブローカー URL を構成すると、組み込みブローカーも無効になります。

  • プロパティ

  • YAML

spring.activemq.broker-url=tcp://192.168.1.210:9876
spring.activemq.user=admin
spring.activemq.password=secret
spring:
  activemq:
    broker-url: "tcp://192.168.1.210:9876"
    user: "admin"
    password: "secret"

組み込みブローカーを完全に制御したい場合は、詳細について ActiveMQ「クラシック」ドキュメント [Apache] (英語) を参照してください。

デフォルトでは、CachingConnectionFactory (Javadoc) はネイティブの ConnectionFactory (英語) を、spring.jms.* の外部構成プロパティによって制御できる適切な設定でラップします。

  • プロパティ

  • YAML

spring.jms.cache.session-cache-size=5
spring:
  jms:
    cache:
      session-cache-size: 5

ネイティブプーリングを使用する場合は、次の例に示すように、org.messaginghub:pooled-jms に依存関係を追加し、それに応じて JmsPoolConnectionFactory (英語) を構成することで実行できます。

  • プロパティ

  • YAML

spring.activemq.pool.enabled=true
spring.activemq.pool.max-connections=50
spring:
  activemq:
    pool:
      enabled: true
      max-connections: 50
サポートされているオプションの詳細については、ActiveMQProperties (Javadoc) を参照してください。より高度なカスタマイズのために、ActiveMQConnectionFactoryCustomizer (Javadoc) を実装する任意の数の Bean を登録することもできます。

デフォルトでは、ActiveMQ "Classic" は宛先がまだ存在しない場合にそれを作成し、指定された名前に対して宛先が解決されるようにします。

ActiveMQArtemis サポート

Spring Boot は、クラスパスで ActiveMQ Artemis [Apache] (英語) が使用可能であることを検出すると、ConnectionFactory (英語) を自動構成できます。ブローカーが存在する場合、組み込みブローカーが自動的に起動して構成されます (モードプロパティが明示的に設定されていない場合)。サポートされているモードは、embedded (組み込みブローカーが必要であること、およびブローカーがクラスパスで使用できない場合にエラーが発生することを明示的に示す) と native (netty トランスポートプロトコルを使用してブローカーに接続する) です。後者が構成されている場合、Spring Boot は、デフォルト設定でローカルマシンで実行されているブローカーに接続する ConnectionFactory (英語) を構成します。

spring-boot-starter-artemis を使用する場合は、既存の ActiveMQ Artemis インスタンスに接続するために必要な依存関係と、JMS と統合するための Spring インフラストラクチャが提供されます。アプリケーションに org.apache.activemq:artemis-jakarta-server を追加すると、組み込みモードを使用できます。

ActiveMQ Artemis 構成は、spring.artemis.* の外部構成プロパティによって制御されます。例: application.properties で次のセクションを宣言できます:

  • プロパティ

  • YAML

spring.artemis.mode=native
spring.artemis.broker-url=tcp://192.168.1.210:9876
spring.artemis.user=admin
spring.artemis.password=secret
spring:
  artemis:
    mode: native
    broker-url: "tcp://192.168.1.210:9876"
    user: "admin"
    password: "secret"

ブローカーを埋め込むときに、永続性を有効にするかどうか、および使用可能にする宛先をリストするかどうかを選択できます。これらは、デフォルトのオプションを使用して作成するためにコンマ区切りのリストとして指定することも、高度なキューおよびトピック構成に対してそれぞれ型 JMSQueueConfiguration (英語) または TopicConfiguration (英語) の Bean を定義することもできます。

デフォルトでは、CachingConnectionFactory (Javadoc) はネイティブの ConnectionFactory (英語) を、spring.jms.* の外部構成プロパティによって制御できる適切な設定でラップします。

  • プロパティ

  • YAML

spring.jms.cache.session-cache-size=5
spring:
  jms:
    cache:
      session-cache-size: 5

ネイティブプーリングを使用する場合は、次の例に示すように、org.messaginghub:pooled-jms への依存関係を追加し、それに応じて JmsPoolConnectionFactory (英語) を構成することで実行できます。

  • プロパティ

  • YAML

spring.artemis.pool.enabled=true
spring.artemis.pool.max-connections=50
spring:
  artemis:
    pool:
      enabled: true
      max-connections: 50

サポートされるオプションの詳細については、ArtemisProperties (Javadoc) を参照してください。

JNDI ルックアップは含まれず、宛先は、ActiveMQ Artemis 構成の name 属性、または構成を通じて提供された名前のいずれかを使用して、その名前に対して解決されます。

JNDI ConnectionFactory を使用する

アプリケーションをアプリケーションサーバーで実行している場合、Spring Boot は JNDI を使用して JMS ConnectionFactory (英語) を見つけようとします。デフォルトでは、java:/JmsXA と java:/XAConnectionFactory の場所がチェックされます。次の例に示すように、別の場所を指定する必要がある場合は、spring.jms.jndi-name プロパティを使用できます。

  • プロパティ

  • YAML

spring.jms.jndi-name=java:/MyConnectionFactory
spring:
  jms:
    jndi-name: "java:/MyConnectionFactory"

メッセージの送信

Spring の JmsTemplate (Javadoc) は自動構成されており、次の例に示すように、独自の Bean に直接自動接続できます。

  • Java

  • Kotlin

import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Component;

@Component
public class MyBean {

	private final JmsTemplate jmsTemplate;

	public MyBean(JmsTemplate jmsTemplate) {
		this.jmsTemplate = jmsTemplate;
	}

	// ...

	public void someMethod() {
		this.jmsTemplate.convertAndSend("hello");
	}

}
import org.springframework.jms.core.JmsTemplate
import org.springframework.stereotype.Component

@Component
class MyBean(private val jmsTemplate: JmsTemplate) {

	// ...

	fun someMethod() {
		jmsTemplate.convertAndSend("hello")
	}

}
JmsMessagingTemplate (Javadoc) も同様の方法で挿入できます。DestinationResolver (Javadoc) または MessageConverter (Javadoc) Bean が定義されている場合、自動構成された JmsTemplate (Javadoc) に自動的に関連付けられます。

メッセージの受信

JMS インフラストラクチャが存在する場合、任意の Bean に @JmsListener (Javadoc) のアノテーションを付けてリスナーエンドポイントを作成できます。JmsListenerContainerFactory (Javadoc) が定義されていない場合は、デフォルトの JmsListenerContainerFactory (Javadoc) が自動的に構成されます。DestinationResolver (Javadoc) MessageConverter (Javadoc) ExceptionListener (英語) Bean が定義されている場合、デフォルトのファクトリに自動的に関連付けられます。

ほとんどのシナリオでは、メッセージリスナーコンテナーはネイティブ ConnectionFactory (英語) に対して構成する必要があります。この方法では、各リスナーコンテナーに独自の接続があり、ローカル回復に関して完全な責任が与えられます。自動構成では、ConnectionFactoryUnwrapper (Javadoc) を使用して、自動構成された接続ファクトリからネイティブ接続ファクトリをアンラップします。

自動構成では、CachedConnectionFactory のみがアンラップされます。

デフォルトでは、デフォルトファクトリはトランザクションです。JtaTransactionManager (Javadoc) が存在するインフラストラクチャで実行する場合、デフォルトでリスナーコンテナーに関連付けられます。そうでない場合は、sessionTransacted フラグが有効になります。後者のシナリオでは、リスナーメソッド (またはそのデリゲート) に @Transactional (Javadoc) を追加することで、ローカルデータストアトランザクションを受信メッセージの処理に関連付けることができます。これにより、ローカルトランザクションが完了すると、受信メッセージが確認されます。これには、同じ JMS セッションで実行されたレスポンスメッセージの送信も含まれます。

次のコンポーネントは、someQueue 宛先にリスナーエンドポイントを作成します。

  • Java

  • Kotlin

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;

@Component
public class MyBean {

	@JmsListener(destination = "someQueue")
	public void processMessage(String content) {
		// ...
	}

}
import org.springframework.jms.annotation.JmsListener
import org.springframework.stereotype.Component

@Component
class MyBean {

	@JmsListener(destination = "someQueue")
	fun processMessage(content: String?) {
		// ...
	}

}
詳細については、@EnableJms (Javadoc) API ドキュメントを参照してください。

さらに多くの JmsListenerContainerFactory (Javadoc) インスタンスを作成する必要がある場合、またはデフォルトをオーバーライドする場合、Spring Boot は、自動構成されたものと同じ設定で DefaultJmsListenerContainerFactory (Javadoc) を初期化するために使用できる DefaultJmsListenerContainerFactoryConfigurer (Javadoc) を提供します。

たとえば、次の例では、特定の MessageConverter (Javadoc) を使用する別のファクトリを公開します。

  • Java

  • Kotlin

import jakarta.jms.ConnectionFactory;

import org.springframework.boot.autoconfigure.jms.DefaultJmsListenerContainerFactoryConfigurer;
import org.springframework.boot.jms.ConnectionFactoryUnwrapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;

@Configuration(proxyBeanMethods = false)
public class MyJmsConfiguration {

	@Bean
	public DefaultJmsListenerContainerFactory myFactory(DefaultJmsListenerContainerFactoryConfigurer configurer,
			ConnectionFactory connectionFactory) {
		DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
		configurer.configure(factory, ConnectionFactoryUnwrapper.unwrapCaching(connectionFactory));
		factory.setMessageConverter(new MyMessageConverter());
		return factory;
	}

}
import jakarta.jms.ConnectionFactory
import org.springframework.boot.autoconfigure.jms.DefaultJmsListenerContainerFactoryConfigurer
import org.springframework.boot.jms.ConnectionFactoryUnwrapper
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.jms.config.DefaultJmsListenerContainerFactory

@Configuration(proxyBeanMethods = false)
class MyJmsConfiguration {

	@Bean
	fun myFactory(configurer: DefaultJmsListenerContainerFactoryConfigurer,
				  connectionFactory: ConnectionFactory): DefaultJmsListenerContainerFactory {
		val factory = DefaultJmsListenerContainerFactory()
		configurer.configure(factory, ConnectionFactoryUnwrapper.unwrapCaching(connectionFactory))
		factory.setMessageConverter(MyMessageConverter())
		return factory
	}

}
上記の例では、カスタマイズでは、自動構成されたファクトリと同じ方法で、ConnectionFactoryUnwrapper (Javadoc) を使用してネイティブ接続ファクトリをメッセージリスナーコンテナーに関連付けます。

次に、次のように、任意の @JmsListener (Javadoc) アノテーション付きメソッドでファクトリを使用できます。

  • Java

  • Kotlin

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;

@Component
public class MyBean {

	@JmsListener(destination = "someQueue", containerFactory = "myFactory")
	public void processMessage(String content) {
		// ...
	}

}
import org.springframework.jms.annotation.JmsListener
import org.springframework.stereotype.Component

@Component
class MyBean {

	@JmsListener(destination = "someQueue", containerFactory = "myFactory")
	fun processMessage(content: String?) {
		// ...
	}

}