ホームページ Java &#&チュートリアル Spring Boot が JMS をどのようにサポートするかを簡単に説明します

Spring Boot が JMS をどのようにサポートするかを簡単に説明します

Nov 02, 2024 am 10:30 AM

Quick look on how Spring Boot supports JMS

コード例

サンプルコードはここからのもので、いくつかの変更が加えられています。執筆時点では、Spring Boot 3.3.0 (Spring Framework 6.1.8) が使用されています。

complete/pom.xml

ActiveMQ 組み込みブローカーに切り替える

<dependency>
    <groupId>org.springframework.boot</groupId>
    <!--<artifactId>spring-boot-starter-artemis</artifactId>-->
    <artifactId>spring-boot-starter-activemq</artifactId>
</dependency>

<dependency>
    <groupId>org.apache.activemq</groupId>
    <!--<artifactId>artemis-jakarta-server</artifactId>-->
    <artifactId>activemq-broker</artifactId>
    <scope>runtime</scope>
</dependency>

<!-- ... -->
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

complete/src/main/resources/application.properties

デバッグログをオンにし、組み込みブローカー URL をセットアップします

#spring.artemis.mode=embedded
debug=true
spring.activemq.broker-url=vm://localhost?broker.persistent=false
ログイン後にコピー
ログイン後にコピー

complete/src/main/java/hello/Application.java

独自に構築するのではなく、Spring Boot によって作成された JmsListenerContainerFactory Bean を使用します

@SpringBootApplication
@EnableJms
public class Application {

    /*@Bean
    public JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory,
                                                    DefaultJmsListenerContainerFactoryConfigurer configurer) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        // This provides all auto-configured defaults to this factory, including the message converter
        configurer.configure(factory, connectionFactory);
        // You could still override some settings if necessary.
        return factory;
    }*/

    //...

}
ログイン後にコピー

complete/src/main/java/hello/Receiver.java

デフォルトを指定しますJmsListenerContainerFactory

@Component
public class Receiver {

    //@JmsListener(destination = "mailbox", containerFactory = "myFactory")
    @JmsListener(destination = "mailbox")
    public void receiveMessage(Email email) {
        System.out.println("Received <" + email + ">");
    }

}
ログイン後にコピー

Spring Boot 自動構成ログ

JMS 関連の構成のみが表示されます。

   ActiveMQAutoConfiguration matched:
      - @ConditionalOnClass found required classes 'jakarta.jms.ConnectionFactory', 'org.apache.activemq.ActiveMQConnectionFactory' (OnClassCondition)
      - @ConditionalOnMissingBean (types: jakarta.jms.ConnectionFactory; SearchStrategy: all) did not find any beans (OnBeanCondition)

   ActiveMQAutoConfiguration#activemqConnectionDetails matched:
      - @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.jms.activemq.ActiveMQConnectionDetails; SearchStrategy: all) did not find any beans (OnBeanCondition)

   ActiveMQConnectionFactoryConfiguration matched:
      - @ConditionalOnMissingBean (types: jakarta.jms.ConnectionFactory; SearchStrategy: all) did not find any beans (OnBeanCondition)

   ActiveMQConnectionFactoryConfiguration.SimpleConnectionFactoryConfiguration matched:
      - @ConditionalOnProperty (spring.activemq.pool.enabled=false) matched (OnPropertyCondition)

   ActiveMQConnectionFactoryConfiguration.SimpleConnectionFactoryConfiguration.CachingConnectionFactoryConfiguration matched:
      - @ConditionalOnClass found required class 'org.springframework.jms.connection.CachingConnectionFactory' (OnClassCondition)
      - @ConditionalOnProperty (spring.jms.cache.enabled=true) matched (OnPropertyCondition)

   JmsAnnotationDrivenConfiguration matched:
      - @ConditionalOnClass found required class 'org.springframework.jms.annotation.EnableJms' (OnClassCondition)

   JmsAnnotationDrivenConfiguration#jmsListenerContainerFactory matched:
      - @ConditionalOnSingleCandidate (types: jakarta.jms.ConnectionFactory; SearchStrategy: all) found a single bean 'jmsConnectionFactory'; @ConditionalOnMissingBean (names: jmsListenerContainerFactory; SearchStrategy: all) did not find any beans (OnBeanCondition)

   JmsAnnotationDrivenConfiguration#jmsListenerContainerFactoryConfigurer matched:
      - @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.jms.DefaultJmsListenerContainerFactoryConfigurer; SearchStrategy: all) did not find any beans (OnBeanCondition)

   JmsAutoConfiguration matched:
      - @ConditionalOnClass found required classes 'jakarta.jms.Message', 'org.springframework.jms.core.JmsTemplate' (OnClassCondition)
      - @ConditionalOnBean (types: jakarta.jms.ConnectionFactory; SearchStrategy: all) found bean 'jmsConnectionFactory' (OnBeanCondition)

   JmsAutoConfiguration.JmsTemplateConfiguration#jmsTemplate matched:
      - @ConditionalOnSingleCandidate (types: jakarta.jms.ConnectionFactory; SearchStrategy: all) found a single bean 'jmsConnectionFactory'; @ConditionalOnMissingBean (types: org.springframework.jms.core.JmsOperations; SearchStrategy: all) did not find any beans (OnBeanCondition)

   JmsAutoConfiguration.MessagingTemplateConfiguration matched:
      - @ConditionalOnClass found required class 'org.springframework.jms.core.JmsMessagingTemplate' (OnClassCondition)

   JmsAutoConfiguration.MessagingTemplateConfiguration#jmsMessagingTemplate matched:
      - @ConditionalOnSingleCandidate (types: org.springframework.jms.core.JmsTemplate; SearchStrategy: all) found a single bean 'jmsTemplate'; @ConditionalOnMissingBean (types: org.springframework.jms.core.JmsMessageOperations; SearchStrategy: all) did not find any beans (OnBeanCondition)
ログイン後にコピー

関連インターフェース

Interface Function
org.springframework.jms.support.destination.DestinationResolver lookup jakarta.jms.Destination instance by String name
org.springframework.transaction.jta.JtaTransactionManager control transaction by JTA
org.springframework.jms.support.converter.MessageConverter serialize/deserialize DTO instance
jakarta.jms.ExceptionListener processor when jakarta.jms.JMSException throws. One implementation is SingleConnectionFactory, connection managed by that class will be restarted once exception is catched
io.micrometer.observation.ObservationRegistry for statistics

コネクションファクトリーについて

ActiveMQ の実装は org.apache.activemq.ActiveMQConnectionFactory ですが、Spring Framework はこれを直接使用しません。このクラスは、 の後続のために org.springframework.jms.connection.CachingConnectionFactory

によってラップされます。
  • 接続 が 1 つだけ作成され、これが再利用されます
  • MessageProducerMessageConsumer をキャッシュします (この例では、MessageProducer のみがキャッシュされます)

出版社

org.springframework.jms.core.JmsTemplate
を介してメッセージを送信する

<dependency>
    <groupId>org.springframework.boot</groupId>
    <!--<artifactId>spring-boot-starter-artemis</artifactId>-->
    <artifactId>spring-boot-starter-activemq</artifactId>
</dependency>

<dependency>
    <groupId>org.apache.activemq</groupId>
    <!--<artifactId>artemis-jakarta-server</artifactId>-->
    <artifactId>activemq-broker</artifactId>
    <scope>runtime</scope>
</dependency>

<!-- ... -->
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

JmsTemplate Bean は org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration.JmsTemplateConfiguration#jmsTemplate によってビルドされます。 DTO を逆シリアル化するには、MessageConverter Bean が必要です。

使用される

DestinationResolverorg.springframework.jms.support.destination.DynamicDestinationResolver です。クラスは、jakarta.jms.Destination インスタンスを取得するだけです。 🎜>jakarta.jms.Session#createTopic または jakarta.jms.Session#createQueue.

購読者

org.springframework.jms.annotation.JmsListener アノテーション

org.springframework.jms.listener.DefaultMessageListenerContainer クラス

JMS 仕様では、非同期メッセージ処理がサポートされており、リスナーは JMS プロバイダーのスレッドで実行されます。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <!--<artifactId>spring-boot-starter-artemis</artifactId>-->
    <artifactId>spring-boot-starter-activemq</artifactId>
</dependency>

<dependency>
    <groupId>org.apache.activemq</groupId>
    <!--<artifactId>artemis-jakarta-server</artifactId>-->
    <artifactId>activemq-broker</artifactId>
    <scope>runtime</scope>
</dependency>

<!-- ... -->
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ただし、Spring Framework では非同期アプローチは使用されず、同期 API (ポーリング) が使用されます。実際のコードは org.springframework.jms.support.destination.JmsDestinationAccessor#receiveFromConsumer.
にあります。

#spring.artemis.mode=embedded
debug=true
spring.activemq.broker-url=vm://localhost?broker.persistent=false
ログイン後にコピー
ログイン後にコピー

org.springframework.jms.listener.DefaultMessageListenerContainer.AsyncMessageListenerInvoker クラスは、定期的にポーリング ジョブを実行するためのものです。これは org.springframework.core.task.SimpleAsyncTaskExecutor.

でスケジュールされます。

1 つの @JmsListener アノテーション付き関数に対して 1 つの DefaultMessageListenerContainer インスタンスが作成されます。これは org.springframework.jms.config.DefaultJmsListenerContainerFactory.

によって生成されます。

もちろん、MessageConverterExceptionListener インスタンスは必要です。

以上がSpring Boot が JMS をどのようにサポートするかを簡単に説明しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Javaのクラスロードメカニズムは、さまざまなクラスローダーやその委任モデルを含むどのように機能しますか? Javaのクラスロードメカニズムは、さまざまなクラスローダーやその委任モデルを含むどのように機能しますか? Mar 17, 2025 pm 05:35 PM

Javaのクラスロードメカニズムは、さまざまなクラスローダーやその委任モデルを含むどのように機能しますか?

2025年のトップ4 JavaScriptフレームワーク:React、Angular、Vue、Svelte 2025年のトップ4 JavaScriptフレームワーク:React、Angular、Vue、Svelte Mar 07, 2025 pm 06:09 PM

2025年のトップ4 JavaScriptフレームワーク:React、Angular、Vue、Svelte

高度なJavaプロジェクト管理、自動化の構築、依存関係の解像度にMavenまたはGradleを使用するにはどうすればよいですか? 高度なJavaプロジェクト管理、自動化の構築、依存関係の解像度にMavenまたはGradleを使用するにはどうすればよいですか? Mar 17, 2025 pm 05:46 PM

高度なJavaプロジェクト管理、自動化の構築、依存関係の解像度にMavenまたはGradleを使用するにはどうすればよいですか?

Javaで機能的なプログラミング技術を実装するにはどうすればよいですか? Javaで機能的なプログラミング技術を実装するにはどうすればよいですか? Mar 11, 2025 pm 05:51 PM

Javaで機能的なプログラミング技術を実装するにはどうすればよいですか?

node.js 20:キーパフォーマンスが向上し、新機能 node.js 20:キーパフォーマンスが向上し、新機能 Mar 07, 2025 pm 06:12 PM

node.js 20:キーパフォーマンスが向上し、新機能

Iceberg:データレイクテーブルの未来 Iceberg:データレイクテーブルの未来 Mar 07, 2025 pm 06:31 PM

Iceberg:データレイクテーブルの未来

キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPA(Java Persistence API)を使用するにはどうすればよいですか? キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPA(Java Persistence API)を使用するにはどうすればよいですか? Mar 17, 2025 pm 05:43 PM

キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPA(Java Persistence API)を使用するにはどうすればよいですか?

カフェインやグアバキャッシュなどのライブラリを使用して、Javaアプリケーションにマルチレベルキャッシュを実装するにはどうすればよいですか? カフェインやグアバキャッシュなどのライブラリを使用して、Javaアプリケーションにマルチレベルキャッシュを実装するにはどうすればよいですか? Mar 17, 2025 pm 05:44 PM

カフェインやグアバキャッシュなどのライブラリを使用して、Javaアプリケーションにマルチレベルキャッシュを実装するにはどうすればよいですか?

See all articles