JMSとActiveMQを使用したSpring Remoting

1概要

/spring-remoting-amqp[前の記事]非同期チャネルの上に RPC AMQP キューとして提供するために Spring Remoting を使用する方法を説明しました。ただし、 JMS を使用しても同じ結果が得られます。

この記事では、実際には、メッセージングミドルウェアとして Spring Remoting JMS Apache ActiveMQ を使用してリモート呼び出しを設定する方法を探ります。

2 Apache ActiveMQブローカーの起動

Apache ActiveMQ は、アプリケーションが非同期的に情報を交換できるようにする オープンソースのメッセージブローカー であり、 Java Message Service API と完全に互換性があります。

私たちの実験を実行するには、まず ActiveMQ の実行中のインスタンスを設定する必要があります。 非公式ガイド に記載されている手順に従うか、それを Java アプリケーションに埋め込むか、より簡単に Docker コンテナを次のようにスピンアップします。コマンド:

docker run -p 61616:61616 -p 8161:8161 rmohr/activemq:5.14.3

これにより ActiveMQ コンテナが起動し、ポート8081に簡単な管理Web GUIが表示されます。これを通じて、利用可能なキュー、接続されているクライアント、その他の管理情報を確認できます。 JMS クライアントは、ブローカーに接続してメッセージを交換するために、ポート61616を使用する必要があります。

3 Mavenの依存関係

Spring Remoting をカバーする以前の記事のように、 JMS Remoting がどのように機能するかを示すためにサーバーとクライアント Spring Boot アプリケーションをセットアップします。

いつものように Spring Boot スターターの依存関係を慎重に選択します。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-activemq</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

Tomcat 関連の .jar ファイルがクラスパスに含まれないように、 spring-boot-starter-tomcat を明示的に除外しました。

これにより、アプリケーションの起動時に__Spring Bootの自動設定メカニズムによって組み込みWebサーバーが起動されるのを防ぐことができなくなります。

4サーバーアプリケーション

4.1. サービスを公開する

クライアントが起動できる CabBookingService を公開するサーバーアプリケーションを設定します。

  • 最初のステップは、クライアントに公開するサービスのインターフェースを実装するBeanを宣言することです** これは、サーバー上でビジネスロジックを実行するBeanです。

@Bean
CabBookingService bookingService() {
    return new CabBookingServiceImpl();
}

次に、コンストラクタで名前を指定して、サーバーが呼び出しを取得するキューを定義しましょう。

@Bean
Queue queue() {
    return new ActiveMQQueue("remotingQueue");
}

以前の記事からすでに知っているように、 Spring Remoting の主な概念の1つは Service Exporter 、あるソースからの呼び出し要求を収集するコンポーネント** 、この場合は ApacheMQ キュー──で目的のメソッドを呼び出します。サービスの実装

JMS を操作するために、 JmsInvokerServiceExporter を定義します。

@Bean
JmsInvokerServiceExporter exporter(CabBookingService implementation) {
    JmsInvokerServiceExporter exporter = new JmsInvokerServiceExporter();
    exporter.setServiceInterface(CabBookingService.class);
    exporter.setService(implementation);
    return exporter;
}

最後に、メッセージを消費する責任を持つリスナーを定義する必要があります。 リスナーは ApacheMQ __ JmsInvokerServiceExporter の間のブリッジとして機能し、キューで使用可能な呼び出しメッセージをlistenし、呼び出しをサービスエクスポーターに転送して結果をシリアル化します。

@Bean SimpleMessageListenerContainer listener(
  ConnectionFactory factory,
  JmsInvokerServiceExporter exporter) {

    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
    container.setConnectionFactory(factory);
    container.setDestinationName("remotingQueue");
    container.setConcurrentConsumers(1);
    container.setMessageListener(exporter);
    return container;
}

4.2. 構成

Application.properties ファイルを設定して、 Spring Boot がいくつかの基本的なオブジェクトを設定できるようにすることを忘れないでください。さまざまなパラメータの値は主に方法によって異なります

さまざまなパラメータの値は、主に ApacheMQ のインストール方法によって異なります。次の例は、これらの例を実行するのと同じマシン上で実行される Docker コンテナの妥当な構成です。

spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.packages.trusted=org.springframework.remoting.support,java.lang,com.baeldung.api

spring.activemq.broker-url パラメーターは、 AMQ ポートへの参照です。代わりに spring.activemq.packages.trusted parameter についてより深い説明が必要です。バージョン5.12.2以降のActiveMQでは、デフォルトですべてのタイプのメッセージが拒否されます。

  • バージョン5.12.2以降、ActiveMQは ObjectMessage 型のメッセージをデフォルトで拒否します。これは、状況によってはセキュリティ攻撃を受ける可能性があると考えられるため、シリアル化された Java オブジェクトの交換に使用されます。

とにかく、指定されたパッケージ内の直列化されたオブジェクトを受け入れるように AMQ に指示することは可能です。 org.springframework.remoting.support は、リモートメソッドの呼び出しとその結果を表すメインメッセージを含むパッケージです。その包み

パッケージ com.baeldung.api には、パラメータと当社のサービスの結果が含まれています。キャブ予約の結果を表すオブジェクトが String を参照しているため、 java.lang が追加されています。したがって、これもシリアル化する必要があります。

5クライアントアプリケーション

5.1. リモートサービスを起動する

今クライアントに取り組みましょう。繰り返しになりますが、呼び出しメッセージが書き込まれるキューを定義する必要があります。クライアントとサーバーの両方が同じ名前を使用していることを再確認する必要があります。

@Bean
Queue queue() {
    return new ActiveMQQueue("remotingQueue");
}

その後、エクスポーターを設定する必要があります。

@Bean
FactoryBean invoker(ConnectionFactory factory, Queue queue) {
    JmsInvokerProxyFactoryBean factoryBean = new JmsInvokerProxyFactoryBean();
    factoryBean.setConnectionFactory(factory);
    factoryBean.setServiceInterface(CabBookingService.class);
    factoryBean.setQueue(queue);
    return factoryBean;
}

これで、リモートサービスをローカルBeanとして宣言されているかのように使用できます。

CabBookingService service = context.getBean(CabBookingService.class);
out.println(service.bookRide("13 Seagate Blvd, Key Largo, FL 33037"));

5.2. 例を実行する

また、クライアントアプリケーションの場合は、アプリケーション内の値を正しく選択する必要があります __。properties __ファイル。一般的な設定では、これらはサーバー側で使用されているものと完全に一致します。

これは Apache AMQ を介したリモート呼び出しを示すのに十分なはずです。それでは、まず ApacheMQ を起動し、次にサーバーアプリケーションを起動し、最後にリモートサービスを呼び出すクライアントアプリケーションを起動しましょう。

6. 結論

このクイックチュートリアルでは、 JMS システムの上に RQ AMQ として提供するために Spring Remoting を使用する方法を説明しました。

Spring Remotingは、基盤となるチャネルに関係なく、非同期呼び出しをすばやく設定する方法を簡単に実証します。

いつものように、あなたはソースhttps://github.com/eugenp/tutorials/tree/master/spring-remoting/remoting-jms[GitHubについて]を見つけるでしょう。